kotlin學習(六)

運算符重載及其他約定

一.重載算術運算符
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實戰》 中講的不夠清晰,還需要再學習一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章