Индекс оператора перегрузки Kotlin с назначением, отличным от заданного

#kotlin #operator-overloading

#котлин #перегрузка оператора

Вопрос:

В Котлине можно ли перегрузить следующую операцию x: X ?

 x[i]  = j  

В настоящее время я вижу только косвенный способ, например, определение некоторых X.get , которые возвращают объект типа XAtIndex со ссылкой на оригинал, а затем определение XAtIndex.plugAssign , которое изменяет оригинал.

Ответ №1:

Если вы хотите = , чтобы объект мутировал, а не изменял то, что хранится в переменной, вы должны реализовать plusAssign тип возвращаемого объекта get() . Примером этого в стандартной библиотеке является MutableList.plusAssign() .

Если вы хотите более традиционное поведение переназначения значения, хранящегося в индексе, после создания измененной копии, ваш класс должен иметь функции сопоставления get и set оператора. Затем вы можете реализовать plus функцию для любого типа get / set (если у него ее нет). При = использовании он будет использовать функции оператора getter и setter вместе с plus оператором возвращаемого типа get . Пример:

 class Foo {  private var thing1: String = "Hello"  private var thing2: String = "World"   operator fun get(thing: Int) = when (thing) {  1 -gt; thing1  2 -gt; thing2  else -gt; throw IllegalArgumentException()  }.also { println("get") }   operator fun set(thing: Int, value: String) {  when (thing) {  1 -gt; thing1 = value  2 -gt; thing2 = value  else -gt; throw IllegalArgumentException()  }  println("set")  }   override fun toString(): String ="Foo(thing1='$thing1', thing2='$thing2')"  }  fun main() {  val foo = Foo()  foo[1]  = "!!!"  println(foo) }  

Комментарии:

1. When = is used, it will use the getter and setter operator functions along with the plus operator of the type returned by get Спасибо, у меня сложилось ошибочное впечатление, что это будет только звонок plusAssign . Это решает все.

2. Функция plusAssign() используется, если она доступна. Но это возвращается к традиционному поведению, когда это не так. Я думаю, что это немного сбивает с толку, что они даже позволяют вам создавать plusAssign и заставлять его вести себя иначе, чем = обычно ожидается.