在Scala中导入对象的方法

时间:2019-03-21 16:13:57

标签: scala dsl

我正在尝试使用Scala编写DSL。我最初希望能够写类似

的东西
   defType "foo"

使用时。

我认为以下方法应该有效:

src / main / scala / Test.scala

class Dsl {
    def defType(name: String) = "dummy"
}
object Dsl {
    def apply() = new Dsl()
}

class UseDsl {
    def foo() = {
        val dsl = Dsl()
        import dsl._

        dsl defType "foo"
        defType("foo")
        defType "foo"
    }
}

无法编译:

[error] Test.scala:15:17: ';' expected but string literal found.
[error]         defType "foo"
[error]                 ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed

显式给出dsl时要使用空格来分隔方法名称和参数。

隐式地使用dsl和括号来表示参数与方法名称的配合。

尝试同时使用它们。

有没有办法让它正常工作?

一旦可行,我计划扩展DSL以支持类似的东西

defType "foo"
   -- "bar1" :: "quz"
   -- "bar2" :: "quz"

等同于

dsl.defType("foo").
   --(ImplicitClass("bar1", dsl).::("quz")).
   --(ImplicitClass("bar2", dsl).::("quz"))

这是我可以开始工作的东西吗?我认为ImplicitClass可以与类似的声明一起工作

def implicit ImplicitClass(a: String, implicit dsl: Dsl) = ...

但是很明显,我对如何让Scala在代码中添加内容的理解并不完善。

如果它不起作用,可以使它起作用的一些最小补充是什么?

build.sbt

ThisBuild / organization := "test"
ThisBuild / version := "0.0.1-SNAPSHOT"
ThisBuild / scalaVersion := "2.12.8"


//
// Projects
//
lazy val root = (project in file("."))

1 个答案:

答案 0 :(得分:1)

否,method argument无效。对于不带括号的infix方法调用,您必须进行

val1 method1 val2 method2 val3 ...

该链可以以没有参数的方法结尾,也可以以最后一个方法的参数结尾,而第一个不是很安全。

即使对于当前类型的成员,也需要执行this method1 ...,并且不能像this中那样省略this.method1(...)