![Scala编程(第5版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/446/43738446/b_43738446.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
6.9 定义操作符
Rational类目前实现的加法还算可行,但我们可以让它更好用。你可能会问自己,为什么对于整数或浮点数,可以写成:
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-135-2.jpg?sign=1739061008-yEDT4Ty7BDMOcmO8cHOtvxWvH6C7Oggm-0-715e13fbe2afdcc3586a3bac15b04d51)
但对于有理数,必须写成:
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-135-3.jpg?sign=1739061008-oK7aH4Iu8YjtXLu5yasUr1NSgpqXGYZg-0-46e74ed7d31ee0d814a4027568ca2019)
或者至少是:
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-136-1.jpg?sign=1739061008-08SKKLaEirIi2OirtpKZAjaaqdUT4Iqy-0-abce594200060b896808b50b07e7e0a9)
写成这样,并没有很有说服力的原因。有理数不过是与其他数一样的数。从数学意义上讲,有理数甚至比浮点数更自然。为什么不可以用自然的算术操作符来操作有理数呢?Scala允许这样做。在本章的剩余部分,我们将向你展示如何做到。
第一步是将add替换成通常的那个数学符号。这个做起来很直截了当,因为在Scala中,+是一个合法的标识符。我们可以简单地定义一个名称为+的方法,在这么做的同时,完全可以顺手实现一个*方法,以执行乘法操作。结果如示例6.4所示。
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-136-2.jpg?sign=1739061008-l6T9wJ5LPRR6U11SRSdEv4ah1dYsFOP5-0-3cac211d8f67dba80cb28e383a23630a)
示例6.4 带有操作符方法的Rational类
有了这样的Rational类,可以写出如下代码:
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-137-1.jpg?sign=1739061008-PVPGWdNi598PO6eLhmrfRRvGJYOJ54So-0-934df0a4502d2399dd37a1f6306e64d4)
与平时一样,最后一行输入的操作符语法等同于方法调用。也可以写成:
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-137-2.jpg?sign=1739061008-agP0skxpwLGX9BkdYvkuVlee2wXTScNm-0-18c3239d62fdc4b3b154638d87b7f972)
不过这并不是那么可读的。
另一个值得注意的点是,按照Scala的操作符优先级(在5.9节介绍过),对于Rational类来说,*方法会比+方法绑得更紧。换句话说,涉及Rational对象的+和*操作,其行为会像我们预期的那样。比如,x + x * y 会被当作x + (x * y)执行,而不是(x + x) * y:
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-137-3.jpg?sign=1739061008-yKRgz7q9BgSk9Bm3HjK6DOMr9otRWBzn-0-2cdada5fc8586282922966e69941cc2d)