Kotlin 中缀表达式

中缀表示法
标有 infix 关键字的函数也可以使用中缀表示法(忽略该调用的点与圆括号)调用。中缀函数必须满足以下要求:

它们必须是成员函数或扩展函数;
它们必须只有一个参数;
其参数不得接受可变数量的参数且不能有默认值。

1
2
3
4
5
6
infix fun Int.shl(x: Int): Int { …… }

// 用中缀表示法调用该函数
1 shl 2
// 等同于这样
1.shl(2)

中缀函数调用的优先级低于算术操作符、类型转换以及 rangeTo 操作符。 以下表达式是等价的:

1
2
3
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- 检测以及其他一些操作符。这些表达式也是等价的:

1
2
3

a && b xor c 与 a && (b xor c)
a xor b in c 与 (a xor b) in c

完整的优先级层次结构请参见其语法参考。

1
2
3
4
5
6
7
8
9
class MyStringCollection {
infix fun add(s: String) { …… }

fun build() {
this add "abc" // 正确
add("abc") // 正确
add "abc" // 错误:必须指定接收者
}
}
1
2
3
infix fun Int.xyz(x:Int):Int{
return x
}
1
2
3
4
5
6

fun main(args: Array<String>) {
val a = 3
3.xyz(2)
3 xyz 2
}