Почему! == имеет меньший приоритет, чем === в Scala? - PullRequest
4 голосов
/ 01 февраля 2020

Следующий код не компилируется:

implicit class TripleEq(val x: Int) {
  def === (y: Int) = x == y
  def !== (y: Int) = x != y
}

val a = 0
val b = 1

if (a == a && b === b) {
  println("Equal")
}

if (a != b && a !== b) {
  println("Not equal")
}

Ошибка:

несоответствие типов; Найдено: Int требуется: Boolean

Ошибка исчезает, когда я заключаю a !== b в скобки.

Я думал, что приоритет оператора определяется его первой буквой (см. Тур по Scala) и, следовательно, приоритет !== должен совпадать с ===, != или ==.

Почему в приведенном выше коде требуются скобки

1 Ответ

5 голосов
/ 01 февраля 2020

Ответ содержится в спецификации языка Операторы присваивания :

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

6.12.14 Операторы присваивания

Оператор присваивания является символом оператора (синтаксическая категория op в идентификаторах), которая заканчивается знаком равенства «=», за исключением операторов, для которых выполняется одно из следующих условий:

  • оператор также начинается с символа равенства или
  • оператор является одним из (<=), (> =), (! =).

На основании этих правил !== считается оператор присваивания, а === нет.

...