返回首页 Scala 课堂

Scala 课堂:基础(二)

这里我们转载 Twitter 的 Scala 课堂 ,转载的内容基本来自 Twitter 的 Scala 课堂中文翻译,部分有小改动.

部分应用(Partial application)

你可以使用下划线“”部分应用一个函数,结果将得到另一个函数。Scala 使用下划线表示不同上下文中的不同事物,你通常可以把它看作是一个没有命名的神奇通配符。在{ + 2 }的上下文中,它代表一个匿名参数。你可以这样使用它:


scala>  def adder(m: Int, n: Int) = m + n
adder: (m: Int, n: Int)Int

scala> val add2 = adder(2, _:Int)
add2: Int => Int = <function1>

scala> add2(3)
res7: Int = 5

你可以部分应用参数列表中的任意参数,而不仅仅是最后一个。

柯里化函数

有时会有这样的需求:允许别人一会在你的函数上应用一些参数,然后又应用另外的一些参数。

例如一个乘法函数,在一个场景需要选择乘数,而另一个场景需要选择被乘数。


scala> def multiply(m: Int)(n: Int): Int = m * n
multiply: (m: Int)(n: Int)Int

你可以直接传入两个参数。


scala>  multiply(2)(3)
res8: Int = 6

你可以填上第一个参数并且部分应用第二个参数。


scala> val timesTwo = multiply(2) _
timesTwo: Int => Int = <function1>

scala>  timesTwo(3)
res9: Int = 6

你可以对任何多参数函数执行柯里化。例如之前的 adder 函数


scala>  (adder _).curried
res10: Int => (Int => Int) = <function1>

可变长度参数

这是一个特殊的语法,可以向方法传入任意多个同类型的参数。例如要在多个字符串上执行 String 的 capitalize 函数,可以这样写:

scala> :paste
// Entering paste mode (ctrl-D to finish)

def capitalizeAll(args: String*) = {
  args.map { arg =>
    arg.capitalize
  }
}

// Exiting paste mode, now interpreting.

capitalizeAll: (args: String*)Seq[String]

scala>  capitalizeAll("rarity", "applejack")
res11: Seq[String] = ArrayBuffer(Rarity, Applejack)