メソッド名に山かっこを使用することは可能ですか?たとえば:
class Foo(ind1:Int,ind2:Int){...}
var v = new Foo(1,2)
v(1) = 3 //updates ind1
v<1> = 4 //updates ind2
実際の状況は明らかにこれよりも複雑です!! 便利なユーザー インターフェイスを提供しようとしています。
メソッド名に山かっこを使用することは可能ですか?たとえば:
class Foo(ind1:Int,ind2:Int){...}
var v = new Foo(1,2)
v(1) = 3 //updates ind1
v<1> = 4 //updates ind2
実際の状況は明らかにこれよりも複雑です!! 便利なユーザー インターフェイスを提供しようとしています。
この応答はそれほど深刻なものではなく、いくつかのハックを使用してこれをほぼ達成できることの単なる証拠です。
class Vector(values: Int*) {
val data = values.toArray
def < (i:Int) = new {
def `>_=`(x: Int) {
data(i) = x
}
def > {
println("value at "+ i +" is "+ data(i))
}
}
override def toString = data.mkString("<", ", ", ">")
}
val v = new Vector(1, 2, 3)
println(v) // prints <1, 2, 3>
v<1> = 10
println(v) // prints <1, 10, 3>
v<1> // prints: value at 1 is 10
このクラスを使用すると、「読み取り」および書き込みアクセス<>
の代わりにを使用するベクトルを作成できます。値を返すと、()
コンパイラ(2.9.0.1)がクラッシュします。>
バグまたは誤用の結果である可能性があります>
。
編集:私は間違っていました。kassens の答えは、あなたが望むようにそれを行う方法を示しています。
作成時に呼び出されるメソッドを実装することはできませんv<1> = 4
(ただし、コンパイラ プラグインを作成する場合を除く)。ただし、次のようなことが可能です。
class Foo {
def at(i: Int) = new Assigner(i)
class Assigner(i: Int) {
def :=(v: Int) = println("assigning " + v + " at index " + i)
}
}
それで:
val f = new Foo
f at 4 := 6
ちょっとした工夫で、実際にあなたが望むものにかなり近づくことができます。
object Foo {
val a:Array[Int] = new Array(100)
def <(i:Int) = new Updater(a, i)
}
class Updater(a:Array[Int], i:Int) {
def update(x:Int) {
a(i) = x
}
def >() = this
}
Foo<1>() = 123
しかし、Scalaがなぜ必要なのかはわかりません()
。そして、はい、これはちょっとしたハックです...