В книге «Программирование в Scala» (Одерски, второе издание) они дают этот оператор старшинства таблицу (не заполняйте здесь):Приоритет операторов & и | в Scala
*/%
+ -
:
= !
< >
&
^
|
Так что, если первый символ оператор имеет более высокую позицию в этой таблице, сначала оценивается первый символ другого оператора, первый оператор.
Согласно, что этот код должен распечатать yy
, но он печатает x
:
def x() = { print('x'); true }
def y() = { print('y'); true }
x || y && y // prints `x` but should `yy`
Я понимаю, что если & выше в таблице, |, он должен быть оценен первым. Это как * имеет приоритет над +, поэтому в x + y * y
последнее утверждение оценивается в первую очередь.
EDIT:
Также посмотрите на этот код
def x() = { print('x'); 1 }
def y() = { print('y'); 3 }
x == x + y * y // xxyy
Посмотрите, как он оценивает их слева направо, но «решает» их в соответствии с таблицей.
Потому что во втором случае 'x' и' y' приводят к 'Int', а в случае Boolean использует другую оценочную модель – 4lex1v
' '' это не то же самое, что '||', и книга не дает приоритет для логических операндов. Я предполагаю, что такой же приоритет используется как для Java, где '&&' все еще выше, чем '||', но тогда здесь работает короткое замыкание. Java также напечатает «x». – maksimov