Kotlin – переопределить / реализовать функцию доступа к массиву

Возможно ли переопределить или реализовать [] аксессоры в Котлине (с использованием перегрузки оператора или аналогичного)?

 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) 
Intereting Posts
Почему Kotlin lang допускает только одну главную функцию в проекте? Что лучше для разработки приложений для Android? Это kotlin или java? Возможно ли скомпилировать Kotlin Native без проверок времени выполнения? Аннотации конструктора Spring на классе данных Kotlin со значениями по умолчанию Почему IntelliJ не распознает мой основной метод? Как настроить Spring Loaded с помощью Kotlin, Gradle и веб-фреймворка? Котлин: Итерация над компонентами объекта Повторное включение будильника для точного в определенное время работы не работает Как создать перечисление из строки в Котлин? Невозможно запустить аниматор в отдельном представлении Как создать новый список из пыльника в котлин? Как использовать KeyEvent в Котлине Как вы определяете команды компиляции, выпущенные IntelliJ Idea? Вызов методов на интерфейсах с дженериками Типы соединений / интерфейсы расширения