Scala DSL, нотация объектов и инфиксов - PullRequest
6 голосов
/ 19 мая 2010

в Scala, если я хочу реализовать DSL, есть ли способ сделать следующее:

У меня есть объект под названием «Draw», который содержит функцию def draw(d:Drawable)

как мне сделать так, чтобы я мог импортировать объект и вызывать его вне объекта, например:

draw ball

если мяч расширяет черту Drawable? Проблема в том, что я хочу использовать рисование в виде инфиксной нотации, но я не хочу квалифицировать функцию draw, обозначив, что она реализует класс / объект.

Ответы [ 2 ]

6 голосов
/ 20 мая 2010

Вы не можете сделать это. Помимо четырех префиксных операторов, в любой записи оператора первый токен представляет объект.

3 голосов
/ 19 мая 2010

Я быстро опробовал его, но вполне мог заставить его работать, используя объект. Там я должен был использовать draw (ball) вместо draw ball, как вы хотели:

<code>
Welcome to Scala version 2.8.0.RC2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_20).</p>

<p>scala> trait Drawable{def doSomething}
defined trait Drawable</p>

<p>scala> object Draw {<br>
        def draw(d:Drawable) = d.doSomething
     }
defined module Draw</p>

<p>scala> val ball = new Drawable{def doSomething = println("doing ball")}
ball: java.lang.Object with Drawable = $anon$1@3a4ba4d6</p>

<p>scala> import Draw._
import Draw._</p>

<p>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
       ^</p>

<p>scala> draw(ball)
doing ball

Однако, определив Draw как класс, он сработал:

<code>
scala> trait Drawable{def doSomething: Unit}
defined trait Drawable</p>

<p>scala> class Draw {<br>
        def draw(d:Drawable) = d.doSomething
     }
defined class Draw</p>

<p>scala> </p>

<p>scala> val ball = new Drawable{def doSomething = println("doing ball")}
ball: java.lang.Object with Drawable = $anon$1@36a06816</p>

<p>scala> val d = new Draw
d: Draw = Draw@7194f467</p>

<p>scala> d draw ball
doing ball

Я не совсем уверен, почему это не работает так же с объектом, может быть ошибкой или, возможно, с указанным поведением. Однако у меня не было времени, чтобы посмотреть его в данный момент.

...