在我的 DSL 中,我希望能够这样做:
val a = 5
Parse("TYPE") {
a match {
case 3 => info("almost")
case s: String => error("wrong type")
case 5 => info("you won!")
case _ => error("omg")
}
}
带输出
[INFO] TYPE: you won!
whereParse
是一个函数对象,它有apply(String)
,info(String)
和error(String)
方法:
object Parse {
def apply(name: String)(parseF: => Unit) { parseF }
def info(text: String) { println("[INFO] " + name + ": " + text) }
def error(text: String) { println("[ERROR] " + name + ": " + text) }
}
诀窍是info
anderror
方法的输出应该以某种方式对Parse
对象来说是本机的,并通过如上所示的示例构造消息。因此,他们
- 必须像示例中一样可访问,无需任何导入。
- 必须有权访问传递给的第一个参数
Parse()
(示例中为“TYPE”)。 - 在工作期间不得创建任何实例或额外对象。
这是一个理想的描述。我认为这将需要更多样板文件。请建议,我怎样才能做到这一点?
编辑:我最初的猜测是在方法中声明info
anderror
方法apply
并没有使它们在parseF
传递的方法中可见。嗯,不出所料..