嵌套方法(NESTED METHODS)
在 Scala 中可以定义嵌套方法。以下提供了 factorial
方法用于计算给定数字的阶乘。
def factorial(x: Int): Int = {
def fact(x: Int, accumulator: Int): Int = {
if (x <= 1) accumulator
else fact(x - 1, x * accumulator)
}
fact(x, 1)
}
println("Factorial of 2: " + factorial(2))
println("Factorial of 3: " + factorial(3))
程序的输出如上图所示。
多参数列表(Currying)
方法可以定义多个参数列表。当用少量的参数列表调用方法时,这将会产生一个函数,将缺少的参数列表作为参数。这被正式的称为 currying。
下面的方法定义在 Scala
集合的 Traversable
trait 中:
def foldLeft[B](z: B)(op: (B, A) => B): B
按照从左到右的顺序,foldLeft
将二进制运算符op
应用于初始化 z
和 traversable
的所有元素。下面的例子展示它的用法。
以一个初始值 0
开始,foldLeft
将函数 (m, n) => m + n
应用于集合中的每个元素和先前的累计值。
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val res = numbers.foldLeft(0)((m, n) => m + n)
print(res) // 55
多参数列表具有冗长的调用语法,因此建议谨慎使用。建议使用的情况包括:
单个函数参数
单个函数参数的情况下(如上面 foldLeft
中的 op
);多参数列表函数允许使用简洁的语法将匿名函数传递给方法。没有多参数列表的情况,代码将会像下面这样:
numbers.foldLeft(0, {(m: Int, n: Int) => m + n})
注意此处还可以利用 Scala 类型推断的优点来使多个参数列表的函数变得更简洁。如下所示,这种写法在非 curring 定义下是不可能的。
numbers.foldLeft(0)(_ + _)
此外,它允许我们固定(fix)参数并可以传递部分函数和重新使用它
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val numberFunc = numbers.foldLeft(List[Int]())_
val squares = numberFunc((xs, x) => xs:+ x*x)
print(squares.toString()) // List(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
val cubes = numberFunc((xs, x) => xs:+ x*x*x)
print(cubes.toString()) // List(1, 8, 27, 64, 125, 216, 343, 512, 729, 1000)
隐式参数
若要将参数列表中的某些参数指定为 implicit
,则应该使用多个参数列表。如下所示:
def execute(arg: Int)(implicit ec: ExecutionContext) = ???