作者:Antonio Leiva 時間:Mar 21, 2017 原文鏈接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每種語言一樣,在Kotlin中,已經預定義了一些操作符執行一定的操作。 最典型的是加(+),減(-),乘(*),除 ...
時間:Mar 21, 2017
原文鏈接:https://antonioleiva.com/operator-overload-kotlin/
就像其他每種語言一樣,在Kotlin中,已經預定義了一些操作符執行一定的操作。
最典型的是加(+),減(-),乘(*),除(/),而且還有很多。
類似Java這樣的一些語言,這些操作符被限制在一些特定的數量類型上,且沒有方法讓其他類型數據使用這些操作符。
還有在像Scala這樣的其他語言中,由於函數名稱可接受任何符號,我們就可創造能用於任何數據類型操作符。
Kotlin的這種方案:有一些預定義的操作符,而我們能夠為任意數據類型重載它們。
Kotlin的操作符重載
如我們討論的,Kotlin能夠重載一些操作符,在我們的類中實現其相應的函數。這些函數前必須加上保留字operator
。
這些基本操作符如下:
一元操作符
+a |
a.unaryPlus() |
-a |
a.unaryMinus() |
!a |
a.not() |
a++ |
a.inc() |
a– |
a.dec() |
二元操作符
a + b |
a.plus(b) |
a – b |
a.minus(b) |
a * b |
a.times(b) |
a / b |
a.div(b) |
a % b |
a.mod(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.modAssign(b) |
數組類型操作符
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) |
等式(equals)操作符
a == b |
a?.equals(b) ?: b === null |
a != b |
!(a?.equals(b) ?: b === null) |
由於
equals
操作使用更複雜地轉換做正確性檢查,並且期望函數準確說明而不僅僅是為它的一個特殊名稱,而稍有一點不同略有不同。
1 fun equals(other: Any?): Boolean
激活(invoking)函數
a(i) |
a.invoke(i) |
a(i, j) |
a.invoke(i, j) |
a(i_1, …, i_n) |
a.invoke(i_1, …, i_n) |
例子
假設你有公司數據模型,每位雇員的列表。
你可以使用get
操作符訪問方括弧中位置。這種實現非常容易:
1 class Employee(val id: Long, val name: String) 2 3 class Company(private val employees: List) { 4 operator fun get(pos: Int) = employees[pos] 5 }
這樣你就可以使用它:
1 val company = Company(listOf(Employee(1235, "John"), Employee(2584, "Mike"))) 2 val mike = company[1]
而你也是能夠超於它,並用ID來恢復值,實現這樣的功能:
1 operator fun get(id: Long) = employees.first { it.id == id } 2 3 val mike = company[2584]
結論
操作符能夠幫助我們為使用通用符號表達已知操作提升可讀性。
小心不要在會導致讀者混淆的情況下使用它們,它們能夠成為一個非常有趣的工具
如果您還不知道怎樣做,我建議你獲取免費指南,學習怎樣創建您的第一個項目,或是直接獲取這本書,學習怎樣從零開始創建一個完整的應用程式。
a.unaryMinus()