Scala编程(第5版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第3步 定义函数

既然知道了Scala变量的用法,那么你可能想试试函数怎么写。在Scala中:

函数定义由def开始,然后是函数名(本例为max)和圆括号中以逗号隔开的参数列表。每个参数的后面都必须加上以冒号(:)开始的类型标注,因为Scala编译器(或者解释器,不过从现在起,我们统一叫它编译器)并不会推断函数参数的类型。在本例中,max函数接收两个参数,即xy,类型都是Int。在max函数的参数列表的右括号之后,你会发现另一个“: Int”类型标注。这里定义的是max函数自己的结果类型result type[7]。在函数的结果类型之后,是一个等号和用花括号括起来的函数体。在本例中,函数体是一个if表达式,用于选择xy中较大的那一个,并作为max函数的返回结果。正如这里展示的那样,Scala的if表达式可以返回一个结果,就像Java的三元运算(ternary operator)一样。比如,Scala表达式“if (x > y) x else y”的行为,类似Java的“(x > y) ? x : y”。函数体之前的等号也有特别的含义,表示在函数式的世界观里,函数定义的是一个可以获取结果值的表达式。函数的基本结构如图2.1所示。

图2.1 函数的基本结构

有时,Scala编译器需要你给出函数的结果类型。比如,如果函数是递归的recursive[8],就必须显式地给出函数的结果类型。在max函数这个例子中,并不需要给出结果类型,编译器就会做出正确的推断。[9]同样地,如果函数函数只有一条语句,也可以选择不使用花括号。因此,也可以这样编写max函数:

一旦定义好函数,就可以按函数的名称来调用它了,比如:

下面是一个不接收任何参数也不返回任何有意义的结果的函数:

当你定义greet函数时,编译器会以greet(): Unit作为响应。“greet”当然是函数的名称,空的圆括号表示该函数不接收任何参数,而Unitgreet函数的返回结果。Unit这样的结果类型表示该函数并不返回任何有实际意义的结果。Scala的Unit类型与Java的void类型类似,每一个Java中返回void的方法都能被映射成Scala中返回Unit的方法。因此,结果类型为Unit的方法之所以被执行,完全是因为其副作用。就greet函数这个示例而言,副作用就是向标准输出中打印一行问候语。

在下一步中,将把Scala代码放到一个文件里,并作为脚本执行。如果想退出编译器,则可以输入:quit