&& и || в Скале - PullRequest
       3

&& и || в Скале

19 голосов
/ 12 октября 2010

, поскольку обычные операторы, такие как +, ::, -> и т. Д., - это все методы, которые могут быть перегружены, и мне было интересно, если ||и && также являются методами.Это могло бы теоретически сработать, если бы это были методы логического объекта.Но если они есть, то почему возможно что-то вроде

if (foo == bar && buz == fol)

?Если компилятор читает справа налево, это вызовет && on bar вместо (foo == bar)

Ответы [ 3 ]

30 голосов
/ 12 октября 2010

6.12.3 Инфиксные операции Инфиксный оператор может быть произвольным идентификатор. Инфиксные операторы имеют определены приоритет и ассоциативность следующим образом:

приоритет инфикса Оператор определяется первый персонаж оператора. Персонажи перечислены в порядке возрастания приоритет, с символами на та же строка, имеющая тот же приоритет.

  • (все буквы)
  • |
  • ^
  • &
  • <>
  • =!
  • + -
  • * /%
  • (все другие специальные символы)

То есть операторы, начинающиеся с письмо имеет самый низкий приоритет, затем следуют операторы, начинающиеся с ‘|’ И т. Д.

Есть одно исключение это правило, касающееся назначения Операторы (§6.12.4). Приоритет оператор присвоения такой же, как простое назначение (=). Тот это ниже, чем приоритет любой другой оператор.

Далее следует объяснение ассоциативности и того, как все это объединяется в выражении с несколькими операторами. Scala Reference делает хорошее чтение.

23 голосов
/ 12 октября 2010

Поскольку метод начинается с =, имеет более высокий приоритет, чем метод начинается с & .

Так что (foo == bar && buz == fol) станет примерно таким:

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

tmp1 && tmp2
0 голосов
/ 28 декабря 2011

Эти два, безусловно, методы в Scala.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...