&&和|| 在斯卡拉

mic*_*ice 19 if-statement scala

因为正常的运算符如+,::, - >等都是可以重载的方法和东西我想知道是否|| 和&&也是方法.如果这是布尔对象的方法,理论上这可以工作.但如果是的话,为什么会这样呢

if (foo == bar && buz == fol)
Run Code Online (Sandbox Code Playgroud)

可能?如果编译器从右向左读取,则会调用&& on bar而不是(foo == bar)

Dan*_*ral 31

6.12.3中缀操作中缀操作符可以是任意标识符.中缀运算符的优先级和关联性定义如下:

中缀运算符的优先级由运算符的第一个字符决定.下面按优先级递增的顺序列出字符,同一行上的字符具有相同的优先级.

  • (所有字母)
  • |
  • ^
  • &
  • <>
  • =!
  • :
  • + -
  • */%
  • (所有其他特殊字符)

也就是说,以字母开头的运算符具有最低优先级,其后是以"|"开头的运算符等.

这条规则有一个例外,它涉及赋值运算符(第6.124节).分配运算符的优先级与简单赋值(=)的优先级相同.也就是说,它低于任何其他运算符的优先级.

下面是对关联性的解释,以及它如何在表达式中与多个运算符组合.在斯卡拉参考,使良好的阅读.


Bri*_*Hsu 23

因为方法以=开头,优先级高于方法以&开头.

所以(foo == bar && buz == fol)会变成如下:

val tmp1: Boolean = (foo == bar)
val tmp2: Boolean = (buz  == fol)

tmp1 && tmp2
Run Code Online (Sandbox Code Playgroud)