第3步 定义函数
既然知道了Scala变量的用法,你可能想试试函数怎么写。在Scala中:
函数定义由def开始,然后是函数名(本例为max)和圆括号中以逗号隔开的参数列表。每个参数的后面都必须加上以冒号(:)开始的类型标注,因为Scala编译器(或者解释器,不过从现在起,我们都统一叫它编译器)并不会推断函数参数的类型。在本例中,max函数接收两个参数,x和y,类型都是Int。在max的参数列表的右括号之后,你会发现另一个“: Int”类型标注。这里定义的是max函数自己的结果类型(result type)。[6]在函数的结果类型之后,是一个等号和用花括号括起来的函数体。在本例中,函数体是一个if表达式,选择x和y中较大的那一个,作为max函数的返回结果。正如这里展示的那样,Scala的if表达式可以返回一个结果,就像Java的三元运算(ternary operator)那样。比如,Scala表达式“if (x > y) x else y”的行为,类似Java的“(x > y) ? x : y”。函数体之前的等号也有特别的含义,表示在函数式的世界观里,函数定义的是一个可以获取到结果值的表达式。函数的基本结构如图2.1所示。
图2.1 函数定义的基本形式
有时,Scala编译器需要你给出函数的结果类型。比如,如果函数是递归的(recursive)[7],就必须显式地给出函数的结果类型。在max这个例子当中,并不需要给出结果类型,编译器会做出正确的推断。[8]同样地,如果函数只有一条语句,也可以选择不使用花括号。因此,也可以这样来编写max函数:
一旦定义好函数,就可以按函数的名字来调用它了,比如:
以下是一个不接收任何参数也不返回任何有意义的结果的函数:
当你定义greet()函数时,解释器会以greet: ()Unit作为响应。“greet”当然是函数的名称,空的圆括号表示该函数不接收任何参数,而Unit是greet的返回结果。Unit这样的结果类型表示该函数并不返回任何有实际意义的结果。Scala的Unit类型跟Java的void类型类似,每一个Java中返回void的方法都能被映射成Scala中返回Unit的方法。因此,结果类型为Unit的方法之所以被执行,完全是基于它们的副作用。就greet()这个示例而言,副作用就是往标准输出中打印一行问候语。
在下一步当中,你将把Scala代码放到一个文件里,并作为脚本执行。如果想退出解释器,可以键入:quit或:q。