带尖括号的方法 (<>)



是否可以在方法名中使用尖括号,例如:

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需要()。是的,这是一个小hack…

最新更新