#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 и заставлять его вести себя иначе, чем
=
обычно ожидается.