您必须使用具有特殊运算符字符的方法来影响Tomasz所暗示的优先顺序。这就是为什么许多Scala DSL会大量使用运营商的原因。此外,为什么一些DSL很难阅读,如果你不每天与他们合作。
鉴于方法只使用字母,下划线和数字 - 你将无法影响的事情,这里是我放在一起为自己读取规格后:
因此,没有在所有知道你的方法签名,下面的代码(因为它的所有字母):如果重命名
someObject.method1(param1).method2(param2).method3(param3)
:
someObject method1 param1 method2 param2 method3 param3
会被解析为method3
到|*|
或+:+
或其他操作符有意义,你可以实现你想要的:
someObject method1 param1 method2 param2 |*| param3
// same as
someObject.method1(param1).method2(param2.|*|(param3))
例如看出区别:
implicit def pimp(s:String) = new {
def |*|(t:String) = t + s
def switch(t:String) = t + s
}
scala> "someObject" concat "param1" concat "param2" |*| "param3"
res2: java.lang.String = someObjectparam1param3param2
scala> "someObject" concat "param1" concat "param2" switch "param3"
res3: java.lang.String = param3someObjectparam1param2
您可能需要阅读http://www.manning.com/ghosh/(在行动中的DSL),因为这将有助于解释很大。他涵盖了Ruby,Scala(主要是Scala),Clojure和Groovy。 –