重拾Kotlin(18)-運算子過載
一、運算子過載
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Kotlin教程(七)運算子過載及其他約定Kotlin
- 運算子過載
- 過載運算子
- [Lang] 運算子過載
- Kotlin 知識梳理(8) 運算子過載及其他約定Kotlin
- C++運算子過載C++
- C++ 運算子過載C++
- C++——運算子過載C++
- [C++]運算子過載C++
- C# 運算子過載C#
- 運算子過載筆記筆記
- Python 運算子過載Python
- Javascript實現運算子過載JavaScript
- python之運算子過載Python
- 指標運算子過載(* 和 ->)指標
- Python——運算子過載(1)Python
- 初步C++運算子過載學習筆記<3> 增量遞減運算子過載C++筆記
- C++ 過載運算子和過載函式C++函式
- C++運算子過載詳解C++
- C++中運算子的過載C++
- 瞭解下C# 運算子過載C#
- 深入C++05:運算子過載C++
- 型別轉換 運算子過載型別
- 過載運算子、解構函式函式
- C++過載的奧義之運算子過載C++
- Kotlin實戰 | 2 = 12 ?泛型、類委託、過載運算子綜合應用Kotlin泛型
- YTU-OJ-實現複數類中的加運算子過載【C++運算子過載】C++
- 【python隨筆】之【運算子過載】Python
- Python中常見運算子過載方法Python
- 優先佇列中過載運算子>和佇列
- 開心檔之C++ 過載運算子和過載函式C++函式
- C++運算子過載的一些困惑C++
- 教你快速理解C++中的運算子過載C++
- C++學習筆記(二) 運算子過載C++筆記
- 手寫程式語言-實現運算子過載
- C#運算子過載---逐步地分析與理解C#
- 重讀 Swift 之二:Operator Declaration(運算子過載)Swift
- 中文版 過載箭頭運算子的理解