在 Scala 编程语言里,定义一个函数的具体语法结构是什么?如果希望显式声明函数的返回类型,应该如何操作?
考察说明
考查对 Scala 函数定义及返回值类型指定方式的基本掌握程度。
回答思路
- 【回答框架 1】Scala 函数定义使用关键字 def,后跟函数名、参数列表(含参数名和类型)、返回类型和等号,再写函数体。参数列表中的每个参数需标明类型,否则会推断为 Any。
- 【回答框架 2】返回类型写在参数列表后的冒号后面,例如 def add(x: Int, y: Int): Int = x + y。若省略返回类型,Scala 会从函数体最后一行的表达式自动推断返回类型,但递归函数必须显式声明返回类型,否则编译报错。
- 【回答框架 3】对于无返回值的过程(即 unit 返回类型),可以通过省略等号和函数体使用花括号包裹的语句块实现,例如 def printMsg(msg: String) { println(msg) },这种方式返回 Unit,但新写法建议显式写 : Unit = 以符合函数式风格。
- 【回答框架 4】此外,单元测试或库中常使用函数字面量(匿名函数),其定义形式为 (x: Int, y: Int) => x + y,也可以作为一等公民赋值给 val。函数定义时需注意参数不可变,默认就是 val 类型。
- 【回答框架 5】函数体若只有单个表达式,可直接放在等号后;若有多条语句,则用花括号包裹,最后一条表达式的值作为返回值。
- 【关键点 1】Scala 用 def 关键字定义函数,且参数列表必须标注类型。
- 【关键点 2】返回类型可在参数列表后用冒号显式声明,也可省略让编译器推断。
- 【关键点 3】递归函数必须显式声明返回类型,否则无法通过编译。
- 【关键点 4】无返回值过程建议显式写 : Unit,而不是靠省略等号。
- 【关键点 5】匿名函数用箭头表达式 (参数) => 函数体,支持高阶函数场景。
- 【易错点 1】不要混淆普通函数与 methods,Scala 中函数是一等对象,但定义方式有区别。
- 【易错点 2】递归函数若不写返回类型,编译器会报错,因为无法自动推断。
- 【易错点 3】省略等号定义 process 时,函数体用花括号,容易误认为有实际返回值,实际返回 Unit。