Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala DSL、对象和中缀符号_Scala_Dsl_Scala 2.8_Infix Notation - Fatal编程技术网

Scala DSL、对象和中缀符号

Scala DSL、对象和中缀符号,scala,dsl,scala-2.8,infix-notation,Scala,Dsl,Scala 2.8,Infix Notation,在Scala中,如果我想实现DSL,有没有办法做到以下几点: 我有一个名为“Draw”的对象,其中包含函数def Draw(d:Drawable) 如何使其能够导入对象并在对象外部调用它,如: draw ball 如果球延伸了可拉伸特性?问题是我想在一种中缀符号中使用draw,但我不想通过表示函数draw的实现类/对象来限定它。我很快尝试了它,但可以通过使用对象来实现它。在那里,我不得不使用draw(ball)而不是draw ball,正如您所希望的: 欢迎使用Scala版本2.8.0.RC

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

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

如何使其能够导入对象并在对象外部调用它,如:

draw ball

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

我很快尝试了它,但可以通过使用对象来实现它。在那里,我不得不使用draw(ball)而不是draw ball,正如您所希望的:


欢迎使用Scala版本2.8.0.RC2(Java热点(TM)64位服务器虚拟机,Java 1.6.020)

scala>特征可绘制{def doSomething} 定义特征可拉伸

scala>对象绘制{
def draw(d:可提取)=d.剂量 } 定义模块图

scala>val ball=new Drawable{def doSomething=println(“doing ball”)} ball:java.lang.Object,带Drawable=$anon$1@3a4ba4d6

scala>导入绘图_ 导入绘图_

scala>拉球 :11:错误:对象绘制中缺少方法绘制的参数; 如果要将其视为部分应用的函数,请使用“\u1”遵循此方法 抽签 ^

scala>抽签(球) 打球

但是,通过将Draw定义为一个类,它确实起了作用:


scala>trait可绘制{def doSomething:Unit}
定义特征可拉伸

scala>类绘图{
def draw(d:可提取)=d.剂量 } 定义类绘制

斯卡拉>

scala>val ball=new Drawable{def doSomething=println(“doing ball”)} ball:java.lang.Object,带Drawable=$anon$1@36a06816

scala>val d=新绘图 d:抽签=Draw@7194f467

scala>d牵引球 打球


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

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

以下线程可能会对其有所说明:总结:仅
~
-
+
可以用于中缀或一元运算符,但不能用于
draw
。您的第一个版本的问题是Scala的“运算符表示法”需要一个显式接收器,这就是类示例工作的原因。我认为draw(ball)是可以接受的语法。我会在某个OpenGLPanel上的(x,y,z)上画(球)。这只是一个做一个小DSL的测试:)谢谢你的回答。顺便说一句:也许你可以接受一些填充符号,比如Draw->ball或其他什么……回到思考:)另一个选项是将Draw方法重命名为“the”。这样,您的示例将变成:“绘制球”。实际上,Felix可以通过使
Draw
成为对象和
ball
成为引用真实对象的隐式转换的匿名类的方法来实现。我怀疑他或其他任何人会喜欢这样,所以这个答案是+1。

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

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