オペレータのオーバーロードなどを使用して、Kotlinで[]
アクセサをオーバーライドまたは実装できますか? PythonでKotlin - 配列のようなアクセサ関数のオーバーライド/実装
val testObject = MyCustumObject()
println(testObject["hi"]) // i.e. implement this accessor.
これは__getitem__
と__setitem__
を実装することが可能です。
オペレータのオーバーロードなどを使用して、Kotlinで[]
アクセサをオーバーライドまたは実装できますか? PythonでKotlin - 配列のようなアクセサ関数のオーバーライド/実装
val testObject = MyCustumObject()
println(testObject["hi"]) // i.e. implement this accessor.
これは__getitem__
と__setitem__
を実装することが可能です。
、それはあなたが実装する必要があること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]
あなたは(インデックスのパラメータの任意の数でget
とset
を定義することができます少なくとも1つ、もちろん)。 a.set(i_1, ..., i_n, b)
get
に翻訳され
a[i_1, ..., i_n]
a.get(i_1, ..., i_n)
a[i_1, ..., i_n] = b
に翻訳されています。加えて、set
は、その最後の引数として渡された使用場所に割り当てられている表現を持っています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
}
注:両方get
機能はm[1]
ような呼び出しと一致するので、この例はMyOrderedMap<Int, SomeType>
にとって望ましくない曖昧さを導入します。
get()をオーバーライドする必要があります。
https://kotlinlang.org/docs/reference/operator-overloading.html
a[i] translates to a.get(i)
the documentationa[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)
に変換されます。 Kotlinで