加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala DSL,对象和中缀表示法

发布时间:2020-12-16 18:55:03 所属栏目:安全 来源:网络整理
导读:在 Scala中,如果我想实现DSL,有没有办法执行以下操作: 我有一个名为“Draw”的对象,其中包含def draw函数(d:Drawable) 我怎样才能使它能够导入Object并在对象外部调用它,如: draw ball 如果球扩展了Drawable特征?问题是我想在一种中缀符号中使用draw,但
在 Scala中,如果我想实现DSL,有没有办法执行以下操作:

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

我怎样才能使它能够导入Object并在对象外部调用它,如:

draw ball

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

解决方法

我很快就试过了,但是可以使用一个对象来完成它.在那里我不得不使用绘画(球)而不是绘球,如你所愿:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读