Scala DSL,对象和中缀表示法

时间:2010-05-19 18:40:49

标签: scala dsl scala-2.8 infix-notation

在Scala中,如果我想实现DSL,有没有办法做到以下几点:

我有一个名为“Draw”的对象,其中包含函数def draw(d:Drawable)

我该怎么做才能导入Object并在对象之外调用它,如:

draw ball

如果球延伸了Drawable特征?问题是我想在一种中缀符号中使用draw,但我不想通过表示它实现类/对象来限定函数draw。

2 个答案:

答案 0 :(得分:6)

你不能这样做。除了四个前缀运算符之外,在任何运算符表示法中,第一个标记代表对象。

答案 1 :(得分:3)

我很快就尝试了,但是可以使用一个对象。在那里我不得不使用平局(球)而不是绘球,如你所愿:


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

我不完全确定为什么这与对象的工作方式不同,可能是一个错误或者可能是指定的行为。但是我现在没有时间查阅它。