Kotlin 使用 set 以外的赋值重载运算符索引

Kotlin overloading operator index with assign other than set

在 Kotlin 中,是否可以将以下操作重载到 x: X

x[i] += j

目前,我只能看到一种间接的方式,比如定义一些X.get,returns一个XAtIndex类型的对象,并引用原始对象,然后定义XAtIndex.plugAssign 即修改原件。

如果您想要 += 改变对象而不是更改变量中存储的内容,则必须对 get() 返回的对象类型实施 plusAssign。标准库中的一个例子是 MutableList.plusAssign().

如果您想要更传统的行为,即在创建修改后的副本后重新分配索引中保存的值,您的 class 应该具有匹配的 getset 运算符函数。然后你可以在 get/set 的任何类型上实现一个 plus 函数(如果它没有)。当使用 += 时,它将使用 getter 和 setter 运算符函数以及 get 返回类型的 plus 运算符。示例:

class Foo {
    private var thing1: String = "Hello"
    private var thing2: String = "World"

    operator fun get(thing: Int) = when (thing) {
        1 -> thing1
        2 -> thing2
        else -> throw IllegalArgumentException()
    }.also { println("get") }

    operator fun set(thing: Int, value: String) {
        when (thing) {
            1 -> thing1 = value
            2 -> thing2 = value
            else -> throw IllegalArgumentException()
        }
        println("set")
    }

    override fun toString(): String ="Foo(thing1='$thing1', thing2='$thing2')"

}

fun main() {
    val foo = Foo()
    foo[1] += "!!!"
    println(foo)
}