跳转到内容

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"。

华夏公益教科书