運算符重載及其他約定
一.重載算術運算符
kotlin限制了運算符重載的類別
1.重載二元算術運算
表達式 | 函數名 |
---|---|
a * b | times |
a / b | div |
a % b | mod |
a + b | plus |
a - b | minus |
data class Point(val x : Int, val y : Int){
operator fun plus(other : Point) : Point{
return Point(x + other.x, y + other.y)
}
}
Point(10,20) + Point(20,30) = Point(30,50)
定義運算符的時候,不要求兩個運算數是相同的類型
operator fun Point.times(scale :Double) : Point{
return Point((x * scale).toInt(), (y * scale).toInt())
}
<注意>kotlin並不支持交換性,上述代碼只支持Point Double,不支持Double Point\
2.重載複合賦值運算符
諸如+=運算會被替換爲plus運算或者plusAssign運算
當兩個函數都定義且適用時,編譯器會報錯
3.重載一元運算符
表達式 | 函數名 |
---|---|
+ a | unaryPlus |
- a | unaryMinus |
! a | not |
++ a ; a ++ | inc |
– a ; a– | dec |
二.重載比較運算符
1.equals
在kotlin中使用==運算符,則將會被轉換爲equals方法的調用
a == b 就相當於 a?.equals(b) ?: (b == null)
=== 爲恆等運算符,對應於Java的= =運算符,用於比較是否是同一個對象
2.compareTo
兩個對象的比較被轉換成conpareTo函數的調用,然後結果與0進行比較
a >= b 就相當於 a.compareTo(b) >= 0
三.集合與區間的約定
使用下標運算符讀取元素會被轉換成get運算符方法的調用,寫入元素將調用set
operator fun Point.get(index : Int) : Int{
return when(index){
0 -> x
1 -> y
else -> throw Exception("")
}
}
val p = Point(10,20)
p[0] => 10
p[1] => 20
即x[a, b] = x.get(a, b)
同理,對於set來講
x[a, b] = c => x.set(a, b, c)
in運算符會調用contains函數
..運算符調用rangeTo函數
for循環中使用in運算符相當於調用iterator函數
四.解構聲明和組件函數
要在解構聲明中初始化每個變量,將調用名稱爲componentN的函數,其中N爲聲明中變量的位置。
對於數據類,編譯器爲每個在主構造方法中聲明的屬性生成一個compenentN函數,對於非數據類需要手動聲明
class Point(val x : Int, val y : Int){
operator fun component1() = x;
operator fun component2() = y;
}
標準庫只允許使用此語法來訪問一個對象的前五個元素
五.重用屬性訪問的邏輯:委託屬性
通過 by lazy實現惰性初始化
通過by運算符,右邊只要是能都被編譯器用正確的參數類型來調用setValue和getValue的對象即可
這一部分 《kotlin實戰》 中講的不夠清晰,還需要再學習一下。