是否可以[]在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)
可以定义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
}
Run Code Online (Sandbox Code Playgroud)
注意:此示例引入了不必要的歧义,MyOrderedMap<Int, SomeType>因为两个get函数都匹配调用m[1].
如文档中所述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).
| 归档时间: |
|
| 查看次数: |
1911 次 |
| 最近记录: |