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

Posted 张鹿鹿

tags:

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

本节介绍 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 中定义好的运算符,不能凭空去重载一个运算符,所以这就有个限制,运算符的数量是有上限的,下一节会介绍对应的解决方案。

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

以上是关于快速上手 Kotlin 开发系列之运算符重载的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

快速上手 Kotlin 开发系列之作用域函数

快速上手 Kotlin 开发系列之类型映射