如何让操作员在一个类中调用它

时间:2012-11-13 02:21:07

标签: scala operators dsl

我正在写一个小型DSL。从其他角度来看,它可以用作自定义控件结构。

这里有一些小例子

case class Reference(var value : Double) {
  def apply() = value
  def update(v : Double) = value = v
}
implicit def toReference(ref:Reference) = ref.value

trait Store {
  import scala.collection.mutable.Buffer
  val index : Buffer[Reference] = Buffer()
  def ++ (v : Double) : Reference = {
    val r = Reference(v)
    index += r
    r
  }
  implicit def toSelf(u : Unit) = this
}

class ExampleStore extends Store {
  val a = () ++ 1.0
  val b = () ++ 2.0
  val c = () ++ 0.5
}


val store = new ExampleStore
store.c() = store.a + store.b

我想访问没有前面的this的类操作符,但是在表达式的开头指定至少()时找不到其他方法。我需要一个“前缀”形式

将此示例重写为以下内容的某种方法

class ExampleStore extends Store {
  val a =++ 1.0
  val b =++ 2.0
  val c =++ 0.5
}

有没有人能想到让scala接受这种惯例的一些技巧?

1 个答案:

答案 0 :(得分:1)

++ 1.0表示++1.0的一元运算符(Double类)。但是,在Scala中,一元运算符仅限于! ~ - +。所以你无法实现你的语法。

但你仍然可以使用括号:

class ExampleStore extends Store {
  val a = ++(1.0)
  val b = ++(2.0)
  val c = ++(3.0)
}