【Kotlin】—— 函式字面值(量)
阿新 • • 發佈:2018-11-03
在學習的 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