这里我们转载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)