在Scala中函數是一等公民,你能夠像操做數字同樣將函數賦值給一個變量。使用val語句能夠定義函數,def語句定義方法:html
class Test{ def m(x: Int) = x + 3 val f = (x: Int) => x + 3 }
在Scala中沒法直接操做方法,若是要操做方法,必須先將其轉換成函數。有兩種方法能夠將方法轉換成函數:app
val f1 = m _
在方法名稱m後面緊跟一個空格和下劃線告訴編譯器將方法m轉換成函數,而不是要調用這個方法。 也能夠顯示地告訴編譯器須要將方法轉換成函數:函數
val f1: (Int) => Int = m
一般狀況下編譯器會自動將方法轉換成函數,例如在一個應該傳入函數參數的地方傳入了一個方法,編譯器會自動將傳入的方法轉換成函數。scala
能夠直接調用函數上的方法,而方法卻不行,例如:code
f.toString //編譯經過 m.toString //編譯失敗
Currying函數能夠只傳入部分參數返回一個偏函數(partially applied function, 也叫部分應用函數),而Currying方法在轉換成偏函數時須要加上顯式說明,讓編譯器完成轉換:htm
object TestCurrying { def invoke(f: Int => Int => Int): Int = { f(1)(2) } def multiply(x: Int)(y: Int): Int = x * y def main(args: Array[String]) { invoke(multiply)//編譯器會自動將multiply方法轉換成函數 val partial1 = multiply(1) //嘗試將Currying方法轉換成偏函數致使編譯失敗 val partial2 = multiply(1): (Int => Int) //編譯經過 val f = multiply _ //將multiply方法轉換成函數f val partial3 = f(1) //只應用第1個參數返回偏函數,編譯經過 } }