Intereting Posts
getFragmentManager () не работает в Котлине Уведомления не отображаются на эмуляторе Oreo В Котлине я могу переопределить некоторые существующие операторы, но как насчет создания новых операторов? Как я могу завершить свой конструктор? Переименование каталога «java» в «kotlin» в Android Studio Kotlin: Как наследовать свойство в классе данных Spring Boot – не может включать статический ресурс Цепочные обещания, возвращающие функции в Kovenant Ошибка приложения из-за того, что экземпляр экземпляра lateinit не инициализирован Могу ли я создать метод расширения Kotlin для добавления rxJava-подписки на композитную подписку? Сопротивление типа приемника Почему mutableMapOf возвращает значение NULL? Расширение TreeMap в Kotlin не работает Как определить параметры типа для основного конструктора в Котлине? Spring JPA не может отображать поле с пользовательским сеттером в классе данных Kotlin

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

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

 val testObject = MyCustumObject() println(testObject["hi"]) // ie implement this accessor. 

В Python это возможно, реализуя __getitem__ и __setitem__ .

Solutions Collecting From Web of "Kotlin – переопределить / реализовать функцию доступа к массиву"

В 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)