Возможно ли переопределить или реализовать []
аксессоры в Котлине (с использованием перегрузки оператора или аналогичного)?
val testObject = MyCustumObject() println(testObject["hi"]) // ie implement this accessor.
В Python это возможно, реализуя __getitem__
и __setitem__
.
В Kotlin это функции get
и set
оператора, которые вам нужно реализовать:
class C { operator fun get(s: String, x: Int) = s + x operator fun set(x: Int, y: Int, value: String) { println("Putting $value at [$x, $y]") } }
И использование:
val c = C() val a = c["123", 4] // "1234" c[1, 2] = "abc" // Putting abc at [1, 2]
Вы можете определить get
и set
с произвольным количеством параметров для индексов (по крайней мере один, конечно); кроме того, set
имеет выражение, которое назначается на сайте использования, переданном в качестве последнего аргумента:
a[i_1, ..., i_n]
переводится в a.get(i_1, ..., i_n)
a[i_1, ..., i_n] = b
переводится в a.set(i_1, ..., i_n, b)
get
и set
могут иметь разные перегрузки, например:
class MyOrderedMap<K, V> { // ... operator fun get(index: Int): Pair<K, V> = ... // i-th added mapping operator fun get(key: K): V = ... // value by key }
Примечание: этот пример вводит нежелательную двусмысленность для MyOrderedMap<Int, SomeType>
поскольку обе функции get
будут соответствовать вызовам типа m[1]
.
Как указано в документации, a[i]
переводится в a.get(i)
. В примере:
class MyObject { operator fun get(ix:Int):String{ return "hello $ix" } }
Давайте напишем:
val a = MyObject() println(a[123]) //-> "hello 123"
Аналогично, a[i] = b
переводится на вызов метода a.set(i, b)
.
Вы должны переопределить get ().
https://kotlinlang.org/docs/reference/operator-overloading.html
a[i] translates to a.get(i)