细谈kotlin中缀表达式
- 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
}
结论
中缀函数是让代码更具可读性和可维护性的强大工具。在使用时要注意其定义要求和运算符优先级。中缀表达式能帮助你提升代码质量,扩展代码书写的可能性。