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 应该具有匹配的 get
和 set
运算符函数。然后你可以在 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)
}
在 Kotlin 中,是否可以将以下操作重载到 x: X
?
x[i] += j
目前,我只能看到一种间接的方式,比如定义一些X.get
,returns一个XAtIndex
类型的对象,并引用原始对象,然后定义XAtIndex.plugAssign
即修改原件。
如果您想要 +=
改变对象而不是更改变量中存储的内容,则必须对 get()
返回的对象类型实施 plusAssign
。标准库中的一个例子是 MutableList.plusAssign()
.
如果您想要更传统的行为,即在创建修改后的副本后重新分配索引中保存的值,您的 class 应该具有匹配的 get
和 set
运算符函数。然后你可以在 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)
}