1

私は小さな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にそのような慣例を受け入れさせるためのトリックを考えられる人はいますか?

4

1 に答える 1

1

書く++ 1.0ということは、それが(クラスDouble)++の単項演算子であることを意味します。1.0ただし、Scalaでは単項演算子はに制限されてい! ~ - +ます。したがって、希望する構文を実装する方法はありません。

ただし、括弧は引き続き使用できます。

class ExampleStore extends Store {
  val a = ++(1.0)
  val b = ++(2.0)
  val c = ++(3.0)
}
于 2012-11-13T07:23:01.810 に答える