в Scala, если я хочу реализовать DSL, там способ сделать следующее:
Мне назвали Объект, "Тянут", который содержит функцию def draw(d:Drawable)
как может я делать его так, чтобы я мог импортировать Объект и назвать его вне объекта как:
draw ball
если шар расширяет черту Drawable? Проблема состоит в том, что я хочу использовать, тянут в своего рода инфиксной нотации, но я не хочу квалифицировать функциональную ничью путем обозначения, что это - класс с реализацией / объект.
Я быстро попробовал, но вполне мог заставить его работать с помощью объекта. Там мне пришлось использовать draw (мяч) вместо 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
Я не совсем уверен, почему это не работает так же способом с объектом, может быть ошибка или, возможно, указанное поведение. Однако в данный момент у меня не было времени посмотреть его.
Вы не можете этого сделать. За исключением четырех префиксных операторов, в любой операторной нотации первая лексема представляет объект.