为什么我们在使用点运算符时应用圆括号以及为什么输出
List(8,9).:::(List(1,2))
和List(1,2):::List(8,9)
相同
答案 0 :(得分:3)
问题有点不清楚,但我猜测你的实际问题是:
怎么回事:
List(1, 2) ::: List(3, 4) == List(3, 4).:::(List(1, 2)) == List(1, 2, 3, 4)
?
换句话说,如何省略点和括号反转参数的顺序?
答案是Scala针对中缀运算符的特殊关联性规则,来自Scala Reference,第6.12.3章:
操作员的关联性由操作员的最后一个字符决定。运营商 以冒号':'结尾是右关联的。所有其他运算符都是左关联的。
这意味着当使用中缀表示法时(即没有点和parens),此运算符(:::
)以冒号结尾,使用左侧值作为方法参数和右手方法作为调用方法:::
的对象。当作为常规方法调用(即使用点和parens)调用时,该方法是左关联的,因为所有方法都是(“左”对象是调用它的对象,右边是参数)。
答案 1 :(得分:2)
调用方法的“普通”Java风格方式是a.b(c)
。 Scala为具有单个参数的方法提供了另外的等效表示法:您可以省略点和parens来编写a b c
。
对于名称以:
结尾的方法,还有一个附加规则:在右操作数而不是左操作数上调用该方法。因此a b: c
去了c.b:(a)
而不是a.b:(c)
。