2-6-广义赋值运算符

运算符对应的方法
a+=ba.plusAssign(b)
a-=ba.minusAssign(b)
a*=ba.timesAssign(b)
a/=ba/.divAssign(b)
a%=ba.remAssign(b)

这种广义的赋值运算符有些特殊,比如 a+=b ,实际上相当于 a=a+b ,因此在程序中进 行 a+= b 运算时,往往并不需要 a 有 plusAssign()方法。 对于广义赋值操作,例如 a+= b , 编译器会先判断 plusAssign()方法是否存在,如果存在, 则按如下步骤执行。

  • 如果 plus() 方法也存在, Kotlin 将会报告错误(调用的目标方法不确定)。

  • 确保 plusAssign() 没有返回值,否则报告错误。

  • 如果能通过前两步的检查,则转换为执行 a.plusAssign(b)。

示例

class Counter(var value: Int) {

// // 情况1:定义 plusAssign()
operator fun plusAssign(other: Int) {
value += other
println("plusAssign 被调用,当前 value=$value")
}

// 取消注释下面的方法会引发编译错误,因为和 plusAssign 冲突

operator fun plus(other: Int): Counter {
println("plus 被调用")
return Counter(value + other)
}

}

fun main() {
var c = Counter(10)

// 使用 += 运算符
// c += 5 // 错误: Ambiguity between assign operator candidates:

val counter = c + 5
println("最终 value=${c.value}")
println(counter.value)
}