2012-11-13 1 views
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 соглашение?

ответ

1

Письмо ++ 1.0 означает, что ++ является унарным оператором 1.0 (класс Double). Однако в Scala унарные операторы ограничены ! ~ - +. Поэтому theres не способ реализовать синтаксис, который вы хотите.

Но вы все еще можете использовать круглые скобки:

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

составитель должен знать, что ++ не является унарный оператор, так как унарный оператор список ограничен – ayvango