Scala 之旅

操作符

语言

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

10.+(1)

但是,将其作为中缀操作符来读取更容易

10 + 1

定义和使用操作符

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

case class Vec(x: Double, y: Double) {
  def +(that: Vec) = Vec(this.x + that.x, this.y + that.y)
}

val vector1 = Vec(1.0, 1.0)
val vector2 = Vec(2.0, 2.0)

val vector3 = vector1 + vector2
vector3.x  // 3.0
vector3.y  // 3.0
case class Vec(x: Double, y: Double):
  def +(that: Vec) = Vec(this.x + that.x, this.y + that.y)

val vector1 = Vec(1.0, 1.0)
val vector2 = Vec(2.0, 2.0)

val vector3 = vector1 + vector2
vector3.x  // 3.0
vector3.y  // 3.0

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

case class MyBool(x: Boolean) {
  def and(that: MyBool): MyBool = if (x) that else this
  def or(that: MyBool): MyBool = if (x) this else that
  def negate: MyBool = MyBool(!x)
}
case class MyBool(x: Boolean):
  def and(that: MyBool): MyBool = if x then that else this
  def or(that: MyBool): MyBool = if x then this else that
  def negate: MyBool = MyBool(!x)

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

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

这有助于使 xor 的定义更具可读性。

优先级

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

(characters not shown below)
* / %
+ -
:
< >
= !
&
^
|
(all letters, $, _)

这适用于你定义的函数。例如,以下表达式

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

等同于

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

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

此页面的贡献者