Scala/函数
Scala 中的函数定义非常灵活,并且仍然简洁。让我们看一个简单的函数定义
def simpleFunction = 3
println(simpleFunction) //Prints "3".
在上面,"def" 关键字用于开始函数定义。在 "def" 关键字之后,紧跟着函数的名称,在本例中为 "simpleFunction"。 "=" 用于表示函数具有返回值。在 "=" 之后是一些表达式,表示函数体,在本例中为 3。然后我们通过简单地写出函数的名称来调用该函数,并打印出结果。请注意,由于函数没有参数,我们没有使用 "()" 来调用它。
由于范围是表达式,并且范围中的最后一条语句是范围的返回值,我们可以编写一个更高级的函数,如下所示
def someFunction = {
val a = 42 - 13*2
a*a
}
println(someFunction) //Prints "256".
最后的语句 "a*a" 是一个表达式,因此成为范围的返回值,并且由于范围是函数的表达式,它成为函数的返回值。如果范围中的最后一条语句是非表达式语句,则返回类型将为 "Unit",表示没有返回值,如下所示
def printNameFunction = println("Jack Sparrow")
printNameFunction //Prints "Jack Sparrow".
由于函数没有返回值,但只有副作用,因此在函数定义中表示这一点是一种良好的风格。除了使用 "=" 来表示函数体之外,还可以只使用一个范围
def printNameFunction2 {println("Captain Haddock")}
printNameFunction2 //Prints "Captain Haddock".
无论最后一个表达式的值是什么,一个放弃 "=" 的函数总是会有 "Unit" 作为返回类型。
上面的函数都有些无聊,因为它们不接受任何参数。函数通过在名称后附加一个 "()" 来给出参数列表,如下所示
def cubed(a:Int) = a*a*a
def pythagoras(a:Double, b:Double) = math.sqrt(a*a + b*b)
println(cubed(-3)) //Prints "-27".
println(pythagoras(3, 4)) //Prints "5.0".
函数中的每个参数都用 "," 分隔,调用函数需要使用 "()" 并按正确的顺序将参数放在括号中。请注意,参数的类型注释是必须的。
你可能已经注意到,在上面,返回值从未明确声明。原因是 Scala 编译器通常可以推断出正确的返回值类型。如果你出于某种原因想要显式声明它,可以在最后一个参数列表和主体开始(用 "=" 或 "{" 表示)之间进行声明,如下所示
def squared(a:Int):Int = a*a
需要明确声明结果类型(截至 Scala 2.9.1)的一个常见情况是递归函数,即调用自身的函数。最基本的例子是阶乘函数
def factorial(n:Int):Int = {
if (n == 0) 1
else n*factorial(n-1)
}
//ERROR: Does not compile!
/*def factorial(n:Int) = {
if (n == 0) 1
else n*factorial(n-1)
}*/
待办事项:关于函数名称的语法。
待办事项:关于前缀函数和中缀函数的语法。
待办事项:关于函数优先级以及 ":" 的语法。
待办事项:函数类型,例如 "Int => Double" 或 "(String => String) => String"。