- Kotlin 是一種適應你編程風格的語言,允許你在想什么時候寫代碼就什么時候寫代碼。Kotlin 提供了一些機制,幫助我們編寫易讀易懂的代碼。
- 其中一個非常有趣的機制是 中綴表達式(infix notation)。它允許我們定義和調用函數時省略點號(
.
)和括號。
中綴表達式
中綴表達式在算術和邏輯代碼中使用。它的特點是操作符寫在兩個操作數之間,例如:2 + 3
,其中 "+"
是一個中綴操作符。
在中綴表達式中,函數名放在參數之間,函數名本身充當操作符。例如函數 add(2, 4)
表示加法(add),也就是 2 add 4
。
要定義中綴函數,必須滿足以下條件:
-
必須是成員函數或擴展函數。
-
必須有且只有一個參數。
-
參數不能是可變數量參數(vararg),且不能有默認值。
只需在函數定義前加上 infix
關鍵字即可定義中綴函數。
infix fun Int.add(x: Int): Int = this + xfun main() {println(1.add(2)) // 結果是 3,作為擴展函數調用println(1 add 2) // 結果是 3,作為中綴函數調用
}
解釋代碼
你可以隨時創建中綴函數,比如為了提高代碼的可讀性,或者創建領域特定語言(DSL)。但要記住,中綴函數調用的優先級低于算術操作符以及語言內置的其他元素,比如類型轉換和 rangeTo
操作符。
infix fun Int.add(x: Int): Int = this + x
fun main() {println(1 add 2 + 3) // 6,等價于 1 add (2 + 3)println(1 add (2 + 3)) // 6println(0..(1 add 3)) // 0..4
}
另一方面,中綴函數調用的優先級高于布爾操作符 &&
和 ||
,以及類型檢查 is
和區間檢查 in
等操作符。
infix fun Int.add(x: Int): Int = this + x
fun main() {println(1 and 2 xor 3 add 4) // 等價于 1 and 2 xor (3 add 4) -> 7println(1 add 2 in 3..4) // 等價于 (1 add 2) in 3..4 -> true
}
記住,中綴函數調用時,接收者和參數都必須明確指定,并且在函數體內必須使用 this
來引用當前接收者。
infix fun Int.add(x: Int): Int = this + x // this 是接收者
fun main() {println(2 + 3) // 這里的接收者是 2
}
標準庫中的中綴函數
Kotlin 標準庫中有許多使用中綴調用的函數示例:
-
to()
:用于創建Pair<A, B>
或Map
的條目。 -
位運算函數:
and()
,or()
,shl()
,shr()
,ushr()
,xor()
。 -
布爾類型的方法:
and()
,or()
,xor()
。 -
字符串類的方法:
matches()
和zip()
等。
fun main() {println("Hi" to "Kotlin") // 輸出: (Hi, Kotlin)println(0x123456 shr 16) // 輸出: 18println(true and false or true xor false) // 輸出: trueprintln("Hi, Kotlin" matches ".*Kotlin".toRegex()) // 輸出: true
}
結論
中綴函數是讓代碼更具可讀性和可維護性的強大工具。在使用時要注意其定義要求和運算符優先級。中綴表達式能幫助你提升代碼質量,擴展代碼書寫的可能性。