中缀表示法
标有 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 }
|