在 Scala 中,如果我想实现 DSL,有没有办法执行以下操作:
我有一个名为“Draw”的对象,其中包含函数def draw(d:Drawable)
我怎样才能做到这一点,以便我可以导入对象并在对象外部调用它,例如:
draw ball
如果球扩展了 Drawable 特征?问题是我想以一种中缀表示法使用draw,但我不想通过表示它正在实现类/对象来限定函数draw。
在 Scala 中,如果我想实现 DSL,有没有办法执行以下操作:
我有一个名为“Draw”的对象,其中包含函数def draw(d:Drawable)
我怎样才能做到这一点,以便我可以导入对象并在对象外部调用它,例如:
draw ball
如果球扩展了 Drawable 特征?问题是我想以一种中缀表示法使用draw,但我不想通过表示它正在实现类/对象来限定函数draw。
你不能这样做。除了四个前缀运算符之外,在任何运算符符号中,第一个标记都表示对象。
我很快就试了一下,但可以使用一个对象让它工作。在那里,我不得不使用 draw(ball) 而不是 draw ball,如您所愿:
Welcome to Scala version 2.8.0.RC2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_20).
scala> trait Drawable{def doSomething}
defined trait Drawable
scala> object Draw {
def draw(d:Drawable) = d.doSomething
}
defined module Draw
scala> val ball = new Drawable{def doSomething = println("doing ball")}
ball: java.lang.Object with Drawable = $anon$1@3a4ba4d6
scala> import Draw._
import Draw._
scala> draw ball
:11: error: missing arguments for method draw in object Draw;
follow this method with `_' if you want to treat it as a partially applied function
draw ball
^
scala> draw(ball)
doing ball
然而,通过将 Draw 定义为一个类,它确实起作用了:
scala> trait Drawable{def doSomething: Unit}
defined trait Drawable
scala> class Draw {
def draw(d:Drawable) = d.doSomething
}
defined class Draw
scala>
scala> val ball = new Drawable{def doSomething = println("doing ball")}
ball: java.lang.Object with Drawable = $anon$1@36a06816
scala> val d = new Draw
d: Draw = Draw@7194f467
scala> d draw ball
doing ball
我不完全确定为什么这与对象的工作方式不同,可能是错误,或者可能是指定的行为。不过我暂时没有时间去查。