Scala课堂(3):基础(二)

jerry Scala 2015年11月25日 收藏

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

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

  1. scala> def adder(m: Int, n: Int) = m + n
  2. adder: (m: Int, n: Int)Int
  3.  
  4. scala> val add2 = adder(2, _:Int)
  5. add2: Int => Int = <function1>
  6.  
  7. scala> add2(3)
  8. res7: Int = 5

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

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

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

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

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

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

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

  1. scala> val timesTwo = multiply(2) _
  2. timesTwo: Int => Int = <function1>
  3.  
  4. scala> timesTwo(3)
  5. res9: Int = 6
  6.  

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

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

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

  1. scala> :paste
  2. // Entering paste mode (ctrl-D to finish)
  3.  
  4. def capitalizeAll(args: String*) = {
  5. args.map { arg =>
  6. arg.capitalize
  7. }
  8. }
  9.  
  10. // Exiting paste mode, now interpreting.
  11.  
  12. capitalizeAll: (args: String*)Seq[String]
  13.  
  14. scala> capitalizeAll("rarity", "applejack")
  15. res11: Seq[String] = ArrayBuffer(Rarity, Applejack)
  16.