Scala DSL,对象和infix符号
-
01-10-2019 - |
题
在Scala中,如果我想实现DSL,是否可以做以下方法:
我有一个称为“ draw”的对象,其中包含函数 def draw(d:Drawable)
我该如何做到这一点,以便我可以导入对象并将其称为外部对象之外的对象:
draw ball
如果球扩展了可绘制的特征?问题在于我想用一种插图符号使用绘制,但是我不想通过表示其实现类/对象来限定绘制功能。
解决方案
我迅速尝试了一下,但是可以使用对象使它起作用。在那里,我必须按照您的意愿使用绘制(球)而不是抽球球:
Welcome to Scala version 2.8.0.RC2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_20).
scala>特征可绘制{def dosomething}定义的特征可绘制
scala>对象绘制{
def draw(d:drawable)= d.d.dosomething}定义的模块绘制
scala> val ball = new drawable {def dosomething = println(“ do ball”)}球:java.lang.Object with with with with with with with with with with with with with with praingable = $ anon $ 1@3a4ba4d6
scala>导入draw._ import draw._
Scala> Draw Ball:11:错误:在对象绘制中缺少方法绘制的方法;如果要将其视为部分应用函数绘制球 ^
Scala> draw(球)做球
但是,通过将抽奖定义为班级,它确实有效:
scala> trait Drawable{def doSomething: Unit}
defined trait Drawable
scala> class draw {
def draw(d:drawable)= d.d.dosomething}定义的类绘制
Scala>
scala> val ball = new drawable {def dosomething = println(“ do ball”)} ball:java.lang.Object with with with with with with with with with with with with with with with praingable = $ anon $ 1@36a06816
scala> val d = new draw d:draw = draw@7194f467
Scala> D绘制球的球
我不完全确定为什么这与对象没有相同的方式,可能是一个错误,也许是指定的行为。但是,目前我没有时间查找。
其他提示
你做不到。除了四个前缀运算符外,在任何操作员符号中,第一个令牌代表对象。