在Scala中,如果要实现DSL,是否可以执行以下操作:

我有一个名为“Draw”的对象,其中包含函数def draw(d:Drawable)
我如何做到这一点,以便可以导入对象并在对象外部调用它,例如:

draw ball

如果球扩展了Drawable特性?问题是我想以一种infix表示法使用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


我不完全确定为什么这与对象不同,为什么可能是错误,或者是特定行为。但是,我现在没有时间查找它。

关于scala - Scala DSL,对象和中缀符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2868341/

10-12 23:13