方法名称中是否可以使用尖括号,例如:
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 需要这个()
。是的,这有点骇人听闻...