Вам придется использовать методы со специальными символами оператора, чтобы влиять на приоритет, как подразумевает Томаш. Отчасти поэтому многие Scala DSL интенсивно используют операторов. Также, почему некоторые DSL трудно читать, если вы не работаете с ними ежедневно.
Данный метод с использованием только букв, подчеркивания и цифр - вы не сможете повлиять на вещи, вот что я собрал для себя после прочтения спецификации:
- Любой метод, который принимает один параметр, может использоваться как инфиксный оператор:
a.m(b)
может быть записано a m b
.
Любой метод, который не требует параметра, может использоваться в качестве постфиксного оператора: a.m
можно записать a m
.
Операторы постфикса имеют более низкий приоритет, чем операторы инфикса , поэтому foo bar baz
означает foo.bar(baz)
, тогда как foo bar baz bam
означает (foo.bar(baz)).bam
, а foo bar baz bam bim
означает (foo.bar(baz)).bam(bim)
.
Итак, совершенно не зная, какие подписи у вашего метода, следующий код (потому что все они буквенно-цифровые):
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