什么是 infix 函數(shù)
Kotlin允許在不使用括號和點號的情況下調(diào)用函數(shù),那么這種函數(shù)被稱為 infix函數(shù)。
舉個例子,直觀地感受一下:
map(
1 to "one",
2 to "two",
3 to "three"
)
這里的 to
就是一個infix
函數(shù)≡腿螅看起來像是一個關鍵字,實際是一個to()
方法璃弄。
下面是to
的源碼要销。可以看到這個方法前面除了使用了publich
修飾外夏块,還多了一個infix
疏咐。
/**
* Creates a tuple of type [Pair] from this and [that].
*
* This can be useful for creating [Map] literals with less noise, for example:
* @sample samples.collections.Maps.Instantiation.mapFromPairs
*/
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
中綴表示法
中綴表示法(或中綴記法)是一個通用的算術或邏輯公式表示方法, 操作符是以中綴形式處于操作數(shù)的中間(例:3 + 4)脐供。
標有infix
函數(shù)浑塞,可以使用中綴表示法調(diào)用。
如何寫一個 infix 函數(shù)
必須滿足以下要求:
- 它們必須是成員函數(shù)或擴展函數(shù)政己;
- 它們必須只有一個參數(shù)酌壕;
- 其參數(shù)不得接受可變數(shù)量的參數(shù)且不能有默認值。
class Util(val number:Int) {
infix fun sum(other: Int) {
println(number + other)
}
}
val u = Util(5)
u sum 5 // 10
u sum 7 // 12
請注意歇由,中綴函數(shù)總是要求指定接收者與參數(shù)卵牍。當使用中綴表示法在當前接收者上調(diào)用方法時,需要顯式使用 this印蓖;不能像常規(guī)方法調(diào)用那樣省略辽慕。
class MyStringCollection {
infix fun add(s: String) { /* …… */ }
fun build() {
this add "abc" // 正確
add("abc") // 正確
add "abc" // 錯誤:必須指定接收者
}
}
中綴函數(shù)與操作符的優(yōu)先級
- 中綴函數(shù)調(diào)用的優(yōu)先級低于算術操作符京腥、類型轉換以及 rangeTo 操作符
1 shl 2 + 3 等價于 1 shl (2 + 3)
0 until n * 2 等價于 0 until (n * 2)
xs union ys as Set<*> 等價于 xs union (ys as Set<*>)
- 中綴函數(shù)調(diào)用的優(yōu)先級高于布爾操作符 && 與 ||赦肃、is- 與 in- 檢測以及其他一些操作符。
a && b xor c 等價于 a && (b xor c)
a xor b in c 等價于 (a xor b) in c