我有我的案例类:
case class MyClass(param : String)( body : => Unit) {
def save(){ ... }
def mymethod(){ ... }
body
save
}
然后我想像这样使用它:
MyClass("param"){ // this function can not see 'mymethod' ---
... |
mymethod() // <
...
}
是否有可能使功能&#39;身体&#39;能够访问mymethod&#39;(以及MyClass类的所有其他方法)?
答案 0 :(得分:2)
你为什么要这个?
我看到两种可能性:
给你的身体&#39;函数上下文参数:
case class MyClass(param : String)( body: MyClass => Unit) {
def mymethod() = println("MyClass.mymethod()")
body(this)
}
MyClass("test"){ ctx =>
ctx.mymethod()
}
或
将您的实用程序函数放在MyClass伴随对象中:
object MyClass {
def mymethod() = println("MyClass.mymethod()")
}
case class MyClass(param : String)( body: => Unit) {
body
}
MyClass("test"){
import MyClass._
mymethod()
}
答案 1 :(得分:1)
一般没有。构建DSL的常用方法是使用某种“命令”对象,可能使用Free Monad:
object MyClass {
sealed trait Command
case class CallMyMethod() extends Command
def myMethod() = liftF[Command, Unit](CallMyMethod())
}
case class MyClass(param: String)(body: Free[Command, Unit]) {
...
body.resume.fold({
case CallMyMethod() => mymethod()
}, _ => {})
...
}
然后,您可以使用for
/ yield
语法编写DSL“程序”:
import MyClass._
MyClass("param")({
for {
_ <- myMethod()
a = someNonMyClassCall()
b <- someOtherMyClassMethod(a)
} yield {}
})
请注意,外部类可以创建CallMyMethod
个对象(因为它们位于伴随对象上),但这没关系,它们“并不意味着什么”,直到它们被{{“解释”为止。 1}}实例。