为什么 !== 在 Scala 中的优先级低于 ===?

Sum*_*uma 4 scala operator-overloading operator-precedence

以下代码无法编译:

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")
}
Run Code Online (Sandbox Code Playgroud)

错误是:

类型不匹配; 找到:需要整数:布尔值

当我将 括a !== b在括号中时,错误消失了。

我认为运算符优先级由它的第一个字母定义(见斯卡拉游),因此的优先级!==应该是相同的===!===

为什么上面的代码需要括号?

Sum*_*uma 5

答案在赋值运算符的语言规范中:

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

6.12.14 赋值运算符

赋值运算符是一个操作符的符号(在标识符类别语法OP),在一个端部等于字符“=”,与为其下列条件之一成立运营商的例外:

  • 运算符也以等号字符开头,或
  • 运算符是 (<=)、(>=)、(!=) 之一。

基于这些规则!==被认为是赋值运算符,而===不是。