在我的DSL我希望能够做到这样的功能对象的隐式方法:斯卡拉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!
其中Parse
是一个函数对象,它具有在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
和error
方法的输出在某种程度上应该是Parse
对象的本地特性,并按照上面的示例构造消息。因此,他们
- 必须如示例中所示,没有任何导入。
- 必须有权访问传递给
Parse()
(示例中为“TYPE”)的第一个参数。 - 在工作期间不得创建任何实例或额外的对象。
这是一个理想的描述。我认为这将需要更多的样板。请建议,我该如何实现这个目标?
编辑:我最初的猜测申报apply
方法里面info
和error
方法并不能让他们在传递的parseF
方法可见。嗯,不出所料..