快速上手 Kotlin 开发系列之运算符重载

204 阅读2分钟

本节介绍 Kotlin 的运算符重载。

在 Kotlin 中有非常多的运算符是通过重载来完成的,例如用于 String 拼接的 +,for 循环中的 ..

运算符重载

我们看下面的示例,for 循环中遍历 1 到 100,其中的 .. 就是通过运算符的重载来完成的。step 是通过中缀来实现的,后面会介绍。

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

通过编译器我们找到 .. 对应的方法(按住 Ctrl 点击):

 public operator fun rangeTo(other: Int): IntRange

operator 在解构一节有过描述:operator 表示将一个函数标记为重载一个操作符或者实现一个约定。 这里就表示标记这个函数为重载一个操作符。

之后,通过打开 IntRange 发现 .. 其实会生成一个迭代器 IntIterator (这里用 Int 类型举例所以会是 Int 类型的迭代器),其中 first 传入的是 1,last 传入的是 100,step 传入是 20。

IntProgressionIterator 跟普通的迭代器类似,例如下一个值 next,最终值 finalElement ,是否有下一个的判断 hasNext 以及获取下一个值的方法 nextInt。(代码理解起来比较简单,就不再赘述)。

override fun iterator(): IntIterator = IntProgressionIterator(first, last, step)

internal class IntProgressionIterator(first: Int, last: Int, val step: Int) : IntIterator() {
    private val finalElement = last
    private var hasNext: Boolean = if (step > 0) first <= last else first >= last
    private var next = if (hasNext) first else finalElement

    override fun hasNext(): Boolean = hasNext

    override fun nextInt(): Int {
        val value = next
        if (value == finalElement) {
            if (!hasNext) throw kotlin.NoSuchElementException()
            hasNext = false
        }
        else {
            next += step
        }
        return value
    }
}

运算符的重载有个特点,它一定是提前在 Kotlin 中定义好的运算符,不能凭空去重载一个运算符,所以这就有个限制,运算符的数量是有上限的,下一节会介绍对应的解决方案。

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

长按关注