目录
1、定义
中缀表达式就是一个比较特殊的函数,特殊之处在于它不需要普通函数的用 对象名+点+函数名 的方式调函数。而是 对象+函数名+对象 的方式。
中缀表达式函数需要用 infix 修饰符修饰。
就比如下面的for循环中,until 和step 都是中缀表达式函数,它们的调用方式,就是对象+函数名+对象 的方式。
class TestMain {
fun testA() {
println("i am testA.")
}
}
fun main() {
//普通函数的调用方式
val test=TestMain();
test.testA()
//中缀表达式函数的调用方式
for (i in 1 until 100 step 10) {
println("i=$i")
}
}
//until 源码
public infix fun Int.until(to: Int): IntRange {
if (to <= Int.MIN_VALUE) return IntRange.EMPTY
return this .. (to - 1).toInt()
}
//step 源码
public infix fun IntProgression.step(step: Int): IntProgression {
checkStepIsPositive(step > 0, step)
return IntProgression.fromClosedRange(first, last, if (this.step > 0) step else -step)
}
2、限制条件
- 必须是成员函数或者扩展函数;
- 必须只有一个参数;
- 参数不能是可变参数或默认参数;
3、应用场景
中缀表达式一般应用于两个相同类型对象之间。适合与两个对象比较。
4、自定义中缀表达式
例子1:下面的中缀表达式函数miss就是作为String的扩展函数。
infix fun String.miss(other: String) {
println("$this miss $other")
}
fun main() {
println("我" miss "你")
}
//输出结果
我 miss 你
例子2:这里就是作为对象的成员函数来声明的
data class Card(var power:Int){
infix fun vs(other:Card):String {
if (this.power > other.power) {
return "i win"
} else if (this.power < other.power){
return "i lose"
}else{
return "I'm as strong as you"
}
}
}
fun main() {
val card1=Card(1000)
val card2=Card(999)
println("card1 vs card2 =${card1 vs card2}")
}
//输出结果
card1 vs card2 =i win