本節介紹 Kotlin 的中綴表達式。bash
經過上一節咱們知道運算符的數量是有上限的,雖然跟隨 Kotlin 版本迭代會有相應的變化可是對開發者而言仍是固定的,所以當運算符不夠的時候我就須要經過中綴表達式的形式去擴展咱們所須要的邏輯。ide
例如上一節提到的 step 關鍵字就是經過中綴表達式來實現的:函數
fun main() {
for(i in 1..100 step 20) {
print("$i ")
}
}
複製代碼
打開 step 源碼發現,拋開 infix 關鍵字不看的話實際上是一個 IntProgression 的擴展函數 step,其中的 this 就表示當前的 IntProgression 對象。ui
在 Kotlin 中經過 infix 關鍵字修飾一個函數就表示這個函數是容許使用中綴的形式去調用。this
public infix fun IntProgression.step(step: Int): IntProgression {
checkStepIsPositive(step > 0, step)
return IntProgression.fromClosedRange(first, last, if (this.step > 0) step else -step)
}
複製代碼
接下來咱們寫一個自定義中綴表達式的示例,用於比較兩個 Int 的值的大小。spa
首先,爲了方便驗證輸出,寫一個密閉類,並重寫他們的 toString 方法:code
sealed class CompareResult {
object LESS: CompareResult() {
override fun toString(): String {
return "小於"
}
}
object MORE: CompareResult() {
override fun toString(): String {
return "大於"
}
}
object EQUAL: CompareResult() {
override fun toString(): String {
return "等於"
}
}
}
複製代碼
接下來寫一箇中綴表達式,根據當前值(this)與輸入值(入參)進行比較判斷大小並返回對應的密閉類:cdn
infix fun Int.vs(num: Int): CompareResult =
when {
this - num < 0 -> CompareResult.LESS
this - num > 0 -> CompareResult.MORE
else -> CompareResult.EQUAL
}
複製代碼
在 main 方法中調用:對象
fun main() {
println(5 vs 6)
println(5 vs 5)
println(7 vs 6)
}
複製代碼
打印結果:開發
小於
等於
大於
複製代碼
特別的,infix 只是表示容許該函數使用中綴形式去調用,因此也能夠使用擴展函數的形式調用,例如:
println(5.vs(6))
複製代碼
以上就是本節內容,歡迎你們關注~