带尖括号的方法(<>)

teu*_*cer 14 syntax dsl scala syntactic-sugar

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

class Foo(ind1:Int,ind2:Int){...}
var v = new Foo(1,2)
v(1) = 3 //updates ind1
v<1> = 4 //updates ind2
Run Code Online (Sandbox Code Playgroud)

真实的情况显然比这更复杂!!我试图提供一个方便的用户界面.

kas*_*ens 38

这种反应并不意味着太严重,只是证明使用一些黑客几乎可以实现这一点.

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
Run Code Online (Sandbox Code Playgroud)

使用这个类,我们可以使用一个向量来<>代替()"读取"和写入访问.如果>返回值,编译器(2.9.0.1)将崩溃.这可能是一个错误或误用的结果>.

  • 对于那些感兴趣的人,问题是https://issues.scala-lang.org/browse/SI-4766. (3认同)
  • 非常好.我试图定义``> _ =``但是没有尝试使用反引号.凉! (2认同)

Jea*_*let 6

编辑:我错了; 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)
  }
}
Run Code Online (Sandbox Code Playgroud)

然后:

val f = new Foo
f at 4 := 6
Run Code Online (Sandbox Code Playgroud)