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