重拾Kotlin(18)-運算子過載

lee_lgw發表於2021-09-09

圖片描述

一、運算子過載

Kotlin 允許為型別提供預定義的運算子實現,這些運算子具有固定的符號表示(例如 + 和 * )和固定的優先順序,透過運算子過載可以將運算子的行為對映到指定的方法。為實現這樣的運算子,需要為類提供一個固定名字的成員函式或擴充套件函式,相應的過載運算子的函式需要用 operator 修飾符標記

1.1、一元運算子

運算子 函式
+a a.unaryPlus()
-a a.unaryMinus()
!a a.not()
a++ a.inc()
a– a.dec()

1.2、二元運算子

運算子 函式
a + b a.plus(b)
a - b a.minus(b)
a * b a.times(b)
a / b a.div(b)
a % b a.rem(b)
a…b a.rangeTo(b)
a in b b.contains(a)
a !in b !b.contains(a)
a += b a.plusAssign(b)
a -= b a.minusAssign(b)
a *= b a.timesAssign(b)
a /= b a.divAssign(b)
a %= b a.remAssign(b)

1.3、陣列運算子

運算子 函式
a[i] a.get(i)
a[i, j] a.get(i, j)
a[i_1, …, i_n] a.get(i_1, …, i_n)
a[i] = b a.set(i, b)
a[i, j] = b a.set(i, j, b)
a[i_1, …, i_n] = b a.set(i_1, …, i_n, b)

1.4、等於運算子

運算子 函式
a == b a?.equals(b) ?: b === null
a != b !(a?.equals(b) ?: b === null)

相等運算子有一點不同,為了達到正確合適的相等檢查做了更復雜的轉換,因為要得到一個確切的函式結構比較,不僅僅是指定的名稱

方法必須要如下準確地被實現:

operator fun equals(other: Any?): Boolean

運算子 === 和 !== 用來做身份檢查(它們分別是 Java 中的 == 和 != ),並且它們不能被過載

1.5、比較運算子

運算子 函式
a > b a.compareTo(b) > 0
a < b a.compareTo(b) < 0
a >= b a.compareTo(b) >= 0
a <= b a.compareTo(b) <= 0

所有的比較都轉換為對 compareTo 的呼叫,這個函式需要返回 Int 值

1.6、函式呼叫

方法 呼叫
a() a.invoke()
a(i) a.invoke(i)
a(i, j) a.invoke(i, j)
a(i_1, …, i_n) a.invoke(i_1, …, i_n)

1.7、例子

看幾個例子

data class Point(val x: Int, val y: Int) {

    //+Point
    operator fun unaryPlus() = Point(+x, +y)

    //Point++ / ++Point
    operator fun inc() = Point(x + 1, y + 1)

    //Point + Point
    operator fun plus(point: Point) = Point(x + point.x, y + point.y)

    //Point + Int
    operator fun plus(value: Int) = Point(x + value, y + value)

    //Point[index]
    operator fun get(index: Int): Int {
        return when (index) {
            0 -> x
            1 -> y
            else -> throw IndexOutOfBoundsException("無效索引")
        }
    }

    //Point(index)
    operator fun invoke(index: Int) = when (index) {
        0 -> x
        1 -> y
        else -> throw IndexOutOfBoundsException("無效索引")
    }

}
fun main(args: Array<String>) {

    //+Point(x=10, y=-20)  =  Point(x=10, y=-20)
    println("+${Point(10, -20)}  =  ${+Point(10, -20)}")

    //Point(x=10, y=-20)++  =  Point(x=10, y=-20)
    var point = Point(10, -20)
    println("${Point(10, -20)}++  =  ${point++}")

    //++Point(x=10, y=-20)  =  Point(x=11, y=-19)
    point = Point(10, -20)
    println("++${Point(10, -20)}  =  ${++point}")

    //Point(x=10, y=-20) + Point(x=10, y=-20)  =  Point(x=20, y=-40)
    println("${Point(10, -20)} + ${Point(10, -20)}  =  ${Point(10, -20) + Point(10, -20)}")

    //Point(x=10, y=-20) + 5  =  Point(x=15, y=-15)
    println("${Point(10, -20)} + ${5}  =  ${Point(10, -20) + 5}")

    point = Point(10, -20)
    //point[0] value is: 10
    println("point[0] value is: ${point[0]}")
    //point[1] value is: -20
    println("point[1] value is: ${point[1]}")

    //point(0) values is: 10
    println("point(0) values is: ${point(0)}")

}

重拾 Kotlin 系列文章目錄:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1020/viewspace-2823018/,如需轉載,請註明出處,否則將追究法律責任。

相關文章