在Scala中,运算符即是方法。 任何具有单个参数的方法都可以用作 中缀运算符。 例如,可以使用点号调用 +

  1. 10.+(1)

而中缀运算符则更易读:

  1. 10 + 1

定义和使用运算符

你可以使用任何合法标识符作为运算符。 包括像 add 这样的名字或像 + 这样的符号。

  1. case class Vec(val x: Double, val y: Double) {
  2. def +(that: Vec) = new Vec(this.x + that.x, this.y + that.y)
  3. }
  4. val vector1 = Vec(1.0, 1.0)
  5. val vector2 = Vec(2.0, 2.0)
  6. val vector3 = vector1 + vector2
  7. vector3.x // 3.0
  8. vector3.y // 3.0

类 Vec 有一个方法 +,我们用它来使 vector1vector2 相加。 使用圆括号,你可以使用易读的语法来构建复杂表达式。 这是 MyBool 类的定义,其中有方法 andor

  1. case class MyBool(x: Boolean) {
  2. def and(that: MyBool): MyBool = if (x) that else this
  3. def or(that: MyBool): MyBool = if (x) this else that
  4. def negate: MyBool = MyBool(!x)
  5. }

现在可以使用 andor 作为中缀运算符:

  1. def not(x: MyBool) = x.negate
  2. def xor(x: MyBool, y: MyBool) = (x or y) and not(x and y)

这有助于让方法 xor 的定义更具可读性。

优先级

当一个表达式使用多个运算符时,将根据运算符的第一个字符来评估优先级:

  1. (characters not shown below)
  2. * / %
  3. + -
  4. :
  5. = !
  6. < >
  7. &
  8. ^
  9. |
  10. (all letters)

这也适用于你自定义的方法。 例如,以下表达式:

  1. a + b ^? c ?^ d less a ==> b | c

等价于

  1. ((a + b) ^? (c ?^ d)) less ((a ==> b) | c)

?^ 具有最高优先级,因为它以字符 ? 开头。 + 具有第二高的优先级,然后依次是 ==>^?|, 和 less