如何更改功能上下文

时间:2014-11-16 14:35:30

标签: scala

我有我的案例类:

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类的所有其他方法)?

2 个答案:

答案 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}}实例。