Intereting Posts
Как использовать инъекцию зависимостей в тестах Spek Получение данных JSON из тела POST в Spark + Kotlin Kotlin RuntimeInvisibleParameterAnnotations: MyType (String) Пользовательский вертикальный просмотрщик не работает с прослушивателем onClick в дочернем представлении Многострочный / сложный инициализатор свойств без лямбда Как загрузить файл в Kotlin REPL Вымытый объект, все еще вызывающий метод (Mockito + Kotlin) Какое правильное название для встроенной документации Kotlin? Как интерпретировать и переводить код kotlin в java? Kotlin с трудом подводит итог к предполагаемому (на месте) параметру Как написать преобразование многократного использования для значения String to Enum в группе классов Enum? (Котлин) Ошибка компиляции типа Kotlin: требуется Success <T>, Found MyError Фильтрация массива объектов по расстоянию Котлин Как создать толстую банку с градиентом kotlin script Как создать экземпляр Singleton только один раз в моем приложении и его библиотеках?

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)