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

Rob*_*bel 9 kotlin

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

val testObject = MyCustumObject()
println(testObject["hi"])  // i.e. implement this accessor.
Run Code Online (Sandbox Code Playgroud)

在Python中,这可以通过实现__getitem__和实现__setitem__.

hot*_*key 11

在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]")
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

val c = C()
val a = c["123", 4] // "1234"
c[1, 2] = "abc" // Putting abc at [1, 2]
Run Code Online (Sandbox Code Playgroud)

可以定义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)

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
}
Run Code Online (Sandbox Code Playgroud)

注意:此示例引入了不必要的歧义,MyOrderedMap<Int, SomeType>因为两个get函数都匹配调用m[1].


mie*_*sol 5

文档中所述a[i],转换为a.get(i).例如:

class MyObject {
    operator fun get(ix:Int):String{
        return "hello $ix"
    }
}
Run Code Online (Sandbox Code Playgroud)

我们写信给你:

val a = MyObject()
println(a[123]) //-> "hello 123"
Run Code Online (Sandbox Code Playgroud)

类似地a[i] = b转换为方法调用a.set(i, b).