如何摆脱scala DSL表达式中的括号?

时间:2013-03-08 21:41:38

标签: scala dsl

我希望能够摆脱我的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魔法吗?

2 个答案:

答案 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"

它没有你想要的那么漂亮,但我认为它减少了意外的复杂性。