Scala入门-操作符(Operators)

Scala入门-操作符(Operators)

操作符(Operators)

在Scala中,操作符是方法。任何带有单个参数的方法都可以被当作一个中缀操作符来用。例如,+可以通过点记法来调用:

10.+(1)

然而,作为一个中缀操作符是更容易阅读的:

10 + 1

定义并使用操作符

你可以使用任何合法的标识符作为一个操作符。这包括类似add这样的名字或者类似+这样的符号。

case class Vec(val x: Double, val y: Double) {
  def +(that: Vec) = new 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具有一个方法+,这个方法用来对vector1和vector2做加法。通过使用圆括号,你可以构建复杂但语法可读性好的表达式。下面是类MyBool的定义,其包含了方法and和or:

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)
}

现在可以用and和or作为中缀操作符了:

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

参考资料

本文译自Tour Of Scala – Operators

上一篇:Scala入门-本地类型推断(Local Type Inference)

下一篇:Scala入门-By-name参数(By-name parameters)

发表评论

电子邮件地址不会被公开。 必填项已用*标注