我希望能够摆脱我的DSL中以下表达式中的括号/括号:
substitute ("hello {0}" using "world")
其余代码如下所示:
class Rule(format: String) {
def using(arggs: String*): Rule = { /* save the args */ return this }
def execute() = { /* substitute params */ }
}
def substitute(rule: Rule) = rule.execute()
implicit def makeRule(format: String) = new Rule(format)
我已经尝试过apply()方法,但我不认为我能这样做。我可以使用一些scala魔法吗?
答案 0 :(得分:3)
当你想省略.
和(
...... )
时,Scala有自己的iamb / iambic计量表(如果你愿意的话):
目标(跳过.
)方法(跳过(
) singleArgument (跳过)
)
singleArgument 是可选的。
每一个无点的,没有parenless的DSL都必须符合这种模式。这就是Scala内部DSL经常如此笨拙的原因。
答案 1 :(得分:1)
对于您的案例不是一个确切的解决方案(@RandallSchulz绝对正确),但您可以使用双字方法:
class RuleHelper(val txt: String) {
def using(arggs: String*): RuleHelper = { /* save the args */ return this }
def execute() = { /* substitute params */ }
}
object substitute {
def in(txt: String) = new RuleHelper(txt)
}
substitute in "hello {0}" using "world"
它没有你想要的那么漂亮,但我认为它减少了意外的复杂性。