這里我們轉(zhuǎn)載 Twitter 的 Scala 課堂 ,轉(zhuǎn)載的內(nèi)容基本來自 Twitter 的 Scala 課堂中文翻譯,部分有小改動(dòng).
你可以使用下劃線“”部分應(yīng)用一個(gè)函數(shù),結(jié)果將得到另一個(gè)函數(shù)。Scala 使用下劃線表示不同上下文中的不同事物,你通??梢园阉醋魇且粋€(gè)沒有命名的神奇通配符。在{ + 2 }的上下文中,它代表一個(gè)匿名參數(shù)。你可以這樣使用它:
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
你可以部分應(yīng)用參數(shù)列表中的任意參數(shù),而不僅僅是最后一個(gè)。
有時(shí)會(huì)有這樣的需求:允許別人一會(huì)在你的函數(shù)上應(yīng)用一些參數(shù),然后又應(yīng)用另外的一些參數(shù)。
例如一個(gè)乘法函數(shù),在一個(gè)場景需要選擇乘數(shù),而另一個(gè)場景需要選擇被乘數(shù)。
scala> def multiply(m: Int)(n: Int): Int = m * n
multiply: (m: Int)(n: Int)Int
你可以直接傳入兩個(gè)參數(shù)。
scala> multiply(2)(3)
res8: Int = 6
你可以填上第一個(gè)參數(shù)并且部分應(yīng)用第二個(gè)參數(shù)。
scala> val timesTwo = multiply(2) _
timesTwo: Int => Int = <function1>
scala> timesTwo(3)
res9: Int = 6
你可以對(duì)任何多參數(shù)函數(shù)執(zhí)行柯里化。例如之前的 adder 函數(shù)
scala> (adder _).curried
res10: Int => (Int => Int) = <function1>
這是一個(gè)特殊的語法,可以向方法傳入任意多個(gè)同類型的參數(shù)。例如要在多個(gè)字符串上執(zhí)行 String 的 capitalize 函數(shù),可以這樣寫:
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)