是否可以在Kotlin中覆盖或实现[]
访问器(使用运算符重载或类似)?
val testObject = MyCustumObject()
println(testObject["hi"]) // i.e. implement this accessor.
在Python中,可以通过实施__getitem__
和__setitem__
来实现。
答案 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 的任意数量的参数定义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]
之类的调用。
答案 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)