什么是 infix 函数
Kotlin允许在不使用括号和点号的情况下调用函数,那么这种函数被称为 infix函数。
举个例子,直观地感受一下:
map(
1 to "one",
2 to "two",
3 to "three"
)
这里的 to
就是一个infix
函数。看起来像是一个关键字,实际是一个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)
中缀表示法
中缀表示法(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4)。
标有infix
函数,可以使用中缀表示法调用。
如何写一个 infix 函数
必须满足以下要求:
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
请注意,中缀函数总是要求指定接收者与参数。当使用中缀表示法在当前接收者上调用方法时,需要显式使用 this;不能像常规方法调用那样省略。
class MyStringCollection {
infix fun add(s: String) { /* …… */ }
fun build() {
this add "abc" // 正确
add("abc") // 正确
add "abc" // 错误:必须指定接收者
}
}
中缀函数与操作符的优先级
- 中缀函数调用的优先级低于算术操作符、类型转换以及 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<*>)
- 中缀函数调用的优先级高于布尔操作符 && 与 ||、is- 与 in- 检测以及其他一些操作符。
a && b xor c 等价于 a && (b xor c)
a xor b in c 等价于 (a xor b) in c