2013-03-08 32 views
4

我希望能夠在下面的表達式擺脫括號/括號在我的DSL:如何擺脫scala 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魔術?

回答

3

Scala有它的抑揚格/抑揚米的自己相當的(如果你願意)當你想省略.( ... )

目標(跳過.方法(跳過(singleArgument(跳過)

singleArgument是可選的。每個無點的,無用的DSL-ish必須適合這種模式。這就是爲什麼Scala內部DSL經常如此高亢。

+0

謝謝,但我知道,這是我在括號內使用。這是我想要以某種方式擺脫的外支架。 – 2013-03-08 22:27:57

+0

而這就是要點。你不能'因爲它會以完全破壞的方式改變分析。你可以做的最好的是「重新組合」你的DSL,因此它符合Scala無點,無括號的語法。 – 2013-03-08 23:15:18

+0

令人失望,但感謝您確認無論如何。 – 2013-03-09 21:26:01

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" 

這不是一樣美麗,因爲你想,但我認爲它減少意外的複雜性。