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