Kotlin - 覆盖/实现类似数组的访问器功能

时间:2016-11-21 13:16:55

标签: kotlin

是否可以在Kotlin中覆盖或实现[]访问器(使用运算符重载或类似)?

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

在Python中,可以通过实施__getitem____setitem__来实现。

3 个答案:

答案 0 :(得分:9)

在Kotlin中,您需要实施get and set operator functions

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]

您可以使用 indices 的任意数量的参数定义getset(当然至少有一个);此外,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)

getset也可以有不同的重载,例如:

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]之类的调用。

答案 1 :(得分:5)

the documentation中所述,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)

答案 2 :(得分:1)

你必须覆盖get()。

https://kotlinlang.org/docs/reference/operator-overloading.html

a[i] translates to a.get(i)