
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
6.9 定义操作符
Rational类目前实现的加法还算可行,但我们可以让它更好用。你可能会问自己,为什么对于整数或浮点数,可以写成:

但对于有理数,必须写成:

或者至少是:

写成这样,并没有很有说服力的原因。有理数不过是与其他数一样的数。从数学意义上讲,有理数甚至比浮点数更自然。为什么不可以用自然的算术操作符来操作有理数呢?Scala允许这样做。在本章的剩余部分,我们将向你展示如何做到。
第一步是将add替换成通常的那个数学符号。这个做起来很直截了当,因为在Scala中,+是一个合法的标识符。我们可以简单地定义一个名称为+的方法,在这么做的同时,完全可以顺手实现一个*方法,以执行乘法操作。结果如示例6.4所示。

示例6.4 带有操作符方法的Rational类
有了这样的Rational类,可以写出如下代码:

与平时一样,最后一行输入的操作符语法等同于方法调用。也可以写成:

不过这并不是那么可读的。
另一个值得注意的点是,按照Scala的操作符优先级(在5.9节介绍过),对于Rational类来说,*方法会比+方法绑得更紧。换句话说,涉及Rational对象的+和*操作,其行为会像我们预期的那样。比如,x + x * y 会被当作x + (x * y)执行,而不是(x + x) * y:
