Это то, что я собрал для себя после прочтения спецификации:
- Любой метод, который принимает один параметр, может быть использован в качестве инфиксного оператора:
a.m(b)
можно записать a m b
. - Любой метод, который не требует параметра, может использоваться в качестве постфиксного оператора:
a.m
можно записать a m
.
Например, можно написать a.##(b)
a ## b
и a.!
могут быть записаны a!
- Постфиксные операторы имеют более низкий приоритет, чем инфиксные операторы , поэтому
foo bar baz
означает foo.bar(baz)
, а foo bar baz bam
означает (foo.bar(baz)).bam
и foo bar baz bam bim
означает (foo.bar(baz)).bam(bim)
. - Также задан метод без параметров m объекта a ,
a.m.m
допустим, но a m m
не так, как он бы анализировал как exp1 op exp2
.
Поскольку существует версия mkString
, которая принимает один параметр, она будет рассматриваться как оператор инфикса в fromFile(file) mkString map caesar(k)_
.Существует также версия mkString
, в которой нет параметра, который можно использовать в качестве постфиксного оператора:
scala> List(1,2) mkString
res1: String = 12
scala> List(1,2) mkString "a"
res2: String = 1a2
Иногда, добавив точку в нужном месте, вы можете получить нужный вам приоритет, например fromFile(file).mkString map { }
И все, что предшествует, происходит перед набором текста и другими фазами, поэтому, хотя list mkString map function
не имеет смысла как list.mkString(map).function
, именно так оно и будет анализироваться.