Scala基礎 - 函數和方法的區別

1. 函數和方法

在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

2. 二者的區別

能夠直接調用函數上的方法,而方法卻不行,例如:code

f.toString //編譯經過
m.toString //編譯失敗

3. Currying函數和Currying方法

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個參數返回偏函數,編譯經過
  }
}

4. 參考文檔:

  1. Scala Functions vs Methods
  2. Why does it compile successfully while pass only one parameter to currying function?
相關文章
相關標籤/搜索