4

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

4

2 回答 2

3

.当你想省略and时,Scala 有它自己的 iamb / iambic 表(如果你愿意的话()

目标(跳过.方法(跳过(单参数(跳过)

singleArgument可选的。

每一个 dotless、parenless DSL-ish 的东西都必须符合这种模式。这就是为什么 Scala 内部的 DSL 经常如此生硬的原因。

于 2013-03-08T22:05:43.767 回答
2

不是您的情况的确切解决方案(@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"

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

于 2013-04-19T15:07:26.467 回答