深入函數

內容

    沒有標題

    function 和method是兩個不同的概念

    定義函數可以有三種方式

    1。 val 名稱 : (輸入參數類型列表)=>返回類型 = (輸入參數列表) => 函數定義
    例如 val add : (Int,Int)=>Int = (x,y) => x+y

    2。 val 名稱 = (輸入參數和類型列表) => 函數定義
    例如 val add = (x:Int,y:Int) => x+y

    3。 def 名稱(輸入參數和類型列表):返回類型 = 函數定義
    例如 def add(x:Int,y:Int):Int = x+y

    我最喜歡第二種定義方法,簡明扼要給人"更函數" 的感覺,但是遞歸函數只能用第一種和第三種,通過反編譯代碼發現
    第三種方法定義的函數實現效率最高,因為它對應的 java 代碼仍然是簡單的函數而第一種和第二種被編譯成一個FunctionN對象
    然後你定義的函數對應到這個對象的一個 apply 方法。
    Ref: http://www.scalacn.com/portal.php?mod=view&aid=4


    對於第一種可以顯示的使用FunctionN的寫法:
    val add:Function2[Int,Int,Int]=(x,y)=>x+y
    //FunctionN中的N表示參數的個數,類型列表最後一個表示返回值的類型
    也可以把函數類型提取出來:
    type twoIntOpFn=(Int,Int)=>Int //twoIntOpFn為函數類型別名
    val add:twoIntOpFn=(x,y)=>x+y
    add(1,2) //3

    object add { def apply(x: Int, y: Int): Int = {x+y} }
    object add extends ((Int,Int) => Int) { def apply(x: Int, y: Int): Int = {x+y} }
    object add extends Function2[Int,Int,Int] { def apply(x: Int, y: Int): Int = {x+y} }




    Comments