本篇文章主要介紹以下幾個(gè)知識(shí)點(diǎn):
- 使用 infix 函數(shù)構(gòu)建更可讀的語(yǔ)法
內(nèi)容參考自第一行代碼第3版
在前面的學(xué)習(xí)中荒适,使用過 A to B
這樣的語(yǔ)法結(jié)構(gòu)構(gòu)建鍵值對(duì)氮趋。這種語(yǔ)法結(jié)構(gòu)可讀性高,更接近于用英語(yǔ)的語(yǔ)法來編寫程序习劫。
上面的 to 并不是 Kotlin 語(yǔ)言中的關(guān)鍵字猴仑,之所以能使用 A to B
這樣是因?yàn)?Kotlin 提供了一種高級(jí)語(yǔ)法糖特性:infix 函數(shù)村砂。
infix 函數(shù)只是把編程語(yǔ)言函數(shù)調(diào)用的語(yǔ)法規(guī)則調(diào)整了一下而已,如 A to B
其實(shí)等價(jià)于 A.to(B)
的寫法葫笼。
舉個(gè)栗子深啤,String 類中的 startsWith()
函數(shù):
if("Hello Wonderful".startsWith("Hello")) {
// to do something
}
上面startsWith()
函數(shù)的用法簡(jiǎn)單,若借助 infix
函數(shù)則可以用一種更具可讀性的語(yǔ)法來表達(dá)路星。
在創(chuàng)建 String 類的擴(kuò)展函數(shù) beginsWith()
的前面加上關(guān)鍵字 infix
如下:
infix fun String.beginsWith(prefix: String) = startsWith(prefix)
這樣 beginsWith()
函數(shù)就變成了一個(gè) infix
函數(shù)溯街,調(diào)用方式如下:
if ("Hello Wonderful" beginsWith "Hello"){
// to do something
}
另外诱桂,infix
函數(shù)有兩個(gè)較嚴(yán)格的限制:
infix 函數(shù)是不能定義成頂層函數(shù)的衡载,它必須是某個(gè)類的成員函數(shù)七蜘,可以用擴(kuò)展函數(shù)的方式將它定義到某個(gè)類中。
infix 函數(shù)必須接收且只能接收一個(gè)參數(shù)抛腕,參數(shù)類型不限制堤尾。
下面舉個(gè)稍微復(fù)雜的栗子肝劲,比如一個(gè)集合:
val list = listOf("apple", "orange", "pear")
if (list.contains("orange")) {
// to do something
}
借助 infix
函數(shù)并給 Collection
接口添加一個(gè)擴(kuò)展函數(shù) has()
如下:
infix fun <T> Collection<T>.has(element: T) = contains(element)
這樣就可以用如下語(yǔ)法來判斷集合中是否包括某個(gè)指定的元素:
val list = listOf("apple", "orange", "pear")
if (list has "orange") {
// to do something
}
接下來思考下 mapOf()
函數(shù)中允許使用 A to B
的語(yǔ)法結(jié)構(gòu)來構(gòu)建鍵值對(duì),是如何實(shí)現(xiàn)的呢郭宝?
直接看下 to()
的源碼如下:
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
可以看到辞槐,用定義泛型函數(shù)的方式將 to()
函數(shù)定義到了 A 類型下,并接收一個(gè) B 類型參數(shù)粘室,創(chuàng)建并返回一個(gè) Pair 對(duì)象榄檬。
也就是說 A to B
實(shí)際上得到的是一個(gè)包含 A、B 數(shù)據(jù)的 Pair 對(duì)象衔统,而 mapOf()
函數(shù)接收的正是一個(gè) Pair 類型的可變參數(shù)列表鹿榜。
當(dāng)然,也可以模仿 to()
函數(shù)的源碼來編寫一個(gè)自己的鍵值對(duì)構(gòu)建函數(shù):
infix fun <A, B> A.with(that: B): Pair<A, B> = Pair(this, that)
將 with()
函數(shù)構(gòu)建的鍵值對(duì)傳入 mapOf()
方法中:
val map = mapOf("name" with "wonderful", "age" with 18)
本篇文章就介紹到這锦爵。