在 Scala 中的对象上导入方法
Import methods on an object in Scala
我正在尝试用 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("."))
否,method argument
无效。对于不带括号的中缀方法调用,您必须做
val1 method1 val2 method2 val3 ...
这个链可以以一个没有参数的方法结束,也可以以最后一个方法的参数结束,第一个方法不太安全。
即使对于当前类型的成员,您也需要执行 this method1 ...
并且不能像 this.method1(...)
.
那样省略 this
我正在尝试用 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("."))
否,method argument
无效。对于不带括号的中缀方法调用,您必须做
val1 method1 val2 method2 val3 ...
这个链可以以一个没有参数的方法结束,也可以以最后一个方法的参数结束,第一个方法不太安全。
即使对于当前类型的成员,您也需要执行 this method1 ...
并且不能像 this.method1(...)
.
this