1. 程式人生 > >【Kotlin】—— 函式字面值(量)

【Kotlin】—— 函式字面值(量)

在學習的 Kotlin 的時候,接觸到了一個概念,即函式字面值,有的也叫函式字面量,(英文:function literal)。

先是 Google 了一番,在結合 javascript字面量什麼是Scala中的函式字面量? 兩篇部落格的理解:
函式字面值(量)即一段函式文字,說白了就是一段程式碼,可以當作引數來傳遞。

函式字面量是匿名的,它們在預設情況下沒有名稱,但是你可以通過將它們繫結到一個變數來給它們一個名字

在 Kotlin 中,Lambda 表示式匿名函式,都是一種 函式字面值。


函式字面值的定義與使用

首先定義一個 max 函式如下:

// 引數 less 的型別為 (T,T) -> Boolean,即一個函式型別。
fun <T> test(less: (T,T) -> Boolean): T? {
    ......
    less(tmp1,tmp2)
}

在使用的時候

//直接傳遞給 test 函式
test<String>({a,b -> a.length < b.length})

//先將函式字面量(Lambda 表示式)賦值給一個變數,然後再傳遞給 test 函式
var p1 = {a:String,b:String -> a.length < b.length}
test<String>(p1)

//先將函式字面量(匿名函式)賦值給一個變數,然後再傳遞給 test 函式
var p2 = fun(a:Int,b:Int):Boolean {
    return a<b
}
test(p2)

//直接傳遞
test(fun(a:Int,b:Int):Boolean {
    return a<b
})

在作為引數傳遞的過程中,Lambda 表示式或者匿名函式並沒有執行。而是傳遞給 test 函式時又被賦值到形參 less 上,然後通過顯示的呼叫 less 來執行傳遞的函式字面值(也就是一段程式碼)的。

(注意:Lambda 表示式匿名函式 是有區別的,詳見:Kotlin程式設計之高階函式,Lambda表示式,匿名函式


帶接收者的函式字面值

參考自:[Kotlin程式設計之高階函式,Lambda表示式,匿名函式]

Kotlin 提供了使用指定的 接收者物件 呼叫函式字面值的功能。 在函式字面值的函式體中,可以呼叫該 接收者物件上 的 方法而無需任何額外的限定符。

這類似於擴充套件函式,它允你在函式體內訪問接收者物件的成員。

/***
 * 帶有接收者的函式字面值(Lambda 表示式)
 */
var test6:Int.(other:Int)->Int = {
    other->
        plus(other) //這裡就是沒有使用額外的限定符直接呼叫接收者物件的方法,等價於 this.plus(other)
        other + this //最後一句即為返回值
}
  • (other:Int)->Int 表明變數 test6 的型別,即 (other:Int)->Int 型別(該型別是一種函式型別);
  • Int. ,點左邊的型別,用於指定接收者的型別,這裡指定為 Int 型;
  • { other->other+1} 即具體的函式字面值,並賦值給了 test6;
  • this 指向接收者。

在使用的時候,需要指定接收者

//類似擴充套件函式的用法,用例項物件來呼叫
 println( 1.test6(2) )
//輸出 3

1 即這裡的接收者,定義的函式字面值裡面的 this 便是指向了它。

/***
 * 帶有接收者的函式字面值(匿名函式)
 */
var test7 = fun Int.(other:Int):Int{
    return this+other   //this是指向接受者的物件
}

println( 1.test7(2))
//輸出 3