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

Posted 张鹿鹿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速上手 Kotlin 开发系列之中缀表达式相关的知识,希望对你有一定的参考价值。

本节介绍 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))

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

以上是关于快速上手 Kotlin 开发系列之中缀表达式的主要内容,如果未能解决你的问题,请参考以下文章

《C#零基础入门之百识百例》(八十五)系统类Stack栈解析 -- 简单中缀表达式转后缀表达式

《C#零基础入门之百识百例》(八十五)系统类Stack栈解析 -- 简单中缀表达式转后缀表达式

快速上手 Kotlin 开发系列之反引号

快速上手 Kotlin 开发系列之比较对象

快速上手 Kotlin 开发系列之循环

快速上手 Kotlin 开发系列之集合操作符