Kotlin學(xué)習(xí):操作符

1.算術(shù)運算符重載

表達(dá)式 翻譯為
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.mod(b) (在 Kotlin 1.1 中被棄用)
a..b a.rangeTo(b)

代碼示例

fun main(args: Array<String>) {
    val number1 = 12.5
    val number2 = 3.5
    var result: Double
    result = number1 + number2
    println("number1 + number2 = $result")
    result = number1 - number2
    println("number1 - number2 = $result")
    result = number1 * number2
    println("number1 * number2 = $result")
    result = number1 / number2
    println("number1 / number2 = $result")
    result = number1 % number2
    println("number1 % number2 = $result")
}

輸出:
number1 + number2 = 16.0
number1 - number2 = 9.0
number1 * number2 = 43.75
number1 / number2 = 3.5714285714285716
number1 % number2 = 2.0

+操作符也可以用于連接字符串
代碼示例

fun main(args: Array<String>) {
    val start = "沒說過!"
    val middle = "不是我! "
    val end = "別瞎說"
    val writer= "------魯迅"
    val result = start + middle + end + writer
    println(result)
}

輸出
沒說過!不是我!別瞎說------魯迅

2.賦值操作符

表達(dá)式 翻譯為
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)、 a.modAssign(b) (在 Kotlin 1.1 中被棄用)

對于賦值操作符需要注意的是,當(dāng)操作內(nèi)容可變的對象時,在聲明對象的時候不能使用var

data class Student(var age: Int) {
    operator fun plus(other: Student): Student{
        return Student(age + other.age)
    }
    operator fun plusAssign(other: Student) {
        age += other.age
    }
}
fun main() {
//    var s1 = Student(10) // 不能這樣聲明Student,否則執(zhí)行 += 時會報錯.
    val s1 = Student(10)
    val s2 = Student(11)
    s1 += s2
}

為什么使用 var 定義的 s1 會導(dǎo)致 += 報錯呢?因為理論上,執(zhí)行 += 時,既可以調(diào)用 s1 = s1 + s2,也就是 s1 = s1.plus(s2),又可以調(diào)用 s1.plusAssign(s2),都符合操作符重載約定,這樣就會產(chǎn)生歧義,而如果使用 val 定義 s1,則只可能執(zhí)行 s1.plusAssign(s2),因為 s1 不可被重新賦值,因此 s1 = s1 + s2 這樣的語法是出錯的,永遠(yuǎn)不可能調(diào)用,那么調(diào)用 s1 += s2 就不會產(chǎn)生歧義了。

既然編譯器會幫我把 a += b 解釋成 a = a + b,那兩者之間有何區(qū)別呢?

+(plus) 始終返回一個新的對象

+= (plusAssign) 用于內(nèi)容可變的類型,修改對象自身的內(nèi)容。

在kotlin的集合庫中也有類似的實現(xiàn)

fun main() {
    val list = arrayListOf(1, 2)
    list += 3
    println("list=$list")
    val newList = list + 4
    println(println("newList=$newList"))
}
運行輸出:
list=[1, 2, 3]
newList=[1, 2, 3, 4]

按住ctrl鼠標(biāo)點擊 \color{#ea4335}{+=}進(jìn)入源碼

public inline operator fun <T> MutableCollection<in T>.plusAssign(element: T) {
    this.add(element)
}

代碼很簡單,直接調(diào)用了原集合的add()方法
用同樣的方式點擊\color{#ea4335}{+}

public operator fun <T> Collection<T>.plus(element: T): List<T> {
    val result = ArrayList<T>(size + 1)
    result.addAll(this)
    result.add(element)
    return result
}

代碼同樣很簡單,只不過這次它是新建了一個集合,將原來的集合addAll(),然后再把element也加入新的集合里返回。

3.in操作符

表達(dá)式 翻譯為
a in b b.contains(a)
a !in b !b.contains(a)
fun main(args: Array<String>) {
    val numbers = intArrayOf(1, 4, 42, -3)
    if (4 in numbers) {
        println("numbers array contains 4.")
    }
}
輸出
numbers array contains 4.

in操作符也可以用于循環(huán)中

fun main(args: Array<String>) {
    val numbers = intArrayOf(1, 2, 3, 4)
    for(i in numbers) {
        print("$i ")
    }
}
輸出
1 2 3 4

4. Invoke操作符

表達(dá)式 翻譯為
a() a.invoke()
a(arg) a.invoke(arg)
a(arg_1,arg_2, ...,arg_n) a.inkove(arg_1, arg_2, ..., arg_n)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容