快速上手 Kotlin 开发系列之中缀表达式

601 阅读2分钟

本节介绍 Kotlin 的中缀表达式。

通过上一节我们知道运算符的数量是有上限的,虽然跟随 Kotlin 版本迭代会有相应的变化但是对开发者而言还是固定的,因此当运算符不够的时候我就需要通过中缀表达式的形式去扩展我们所需要的逻辑。

中缀表达式

例如上一节提到的 step 关键字就是通过中缀表达式来实现的:

fun main() {
    for(i in 1..100 step 20) {
        print("$i ")
    }
}

打开 step 源码发现,抛开 infix 关键字不看的话其实是一个 IntProgression 的扩展函数 step,其中的 this 就表示当前的 IntProgression 对象。

在 Kotlin 中通过 infix 关键字修饰一个函数就表示这个函数是允许使用中缀的形式去调用。

public infix fun IntProgression.step(step: Int): IntProgression {
    checkStepIsPositive(step > 0, step)
    return IntProgression.fromClosedRange(first, last, if (this.step > 0) step else -step)
}

自定义中缀表达式

接下来我们写一个自定义中缀表达式的示例,用于比较两个 Int 的值的大小。

首先,为了方便验证输出,写一个密闭类,并重写他们的 toString 方法:

sealed class CompareResult {
    object LESS: CompareResult() {
        override fun toString(): String {
            return "小于"
        }
    }
    object MORE: CompareResult() {
        override fun toString(): String {
            return "大于"
        }
    }
    object EQUAL: CompareResult() {
        override fun toString(): String {
            return "等于"
        }
    }
}

接下来写一个中缀表达式,根据当前值(this)与输入值(入参)进行比较判断大小并返回对应的密闭类:

infix fun Int.vs(num: Int): CompareResult =
    when {
        this - num < 0 -> CompareResult.LESS
        this - num > 0 -> CompareResult.MORE
        else -> CompareResult.EQUAL
    }

在 main 方法中调用:

fun main() {
    println(5 vs 6)
    println(5 vs 5)
    println(7 vs 6)
}

打印结果:

小于
等于
大于

特别的,infix 只是表示允许该函数使用中缀形式去调用,所以也可以使用扩展函数的形式调用,例如:

println(5.vs(6))

以上就是本节内容,欢迎大家关注~

长按关注