在 Rational 类中,为有理数定义了 4 种操作。它们是规范的数学操作:加、减、乘、除。每种操作以它的数学符号命名:+、-、 * 和 /。
但是请注意,这些操作符每次操作时都构造一个新的 Rational 对象。同样,这与 java.lang.String 非常相似,这是默认的实现,因为这样可以产生线程安全的代码(如果线程没有修改共享状态 —— 默认情况下,跨线程共享的对象的内部状态也属于共享状态 —— 则不会影响对那个状态的并发访问)。
有什么变化?
一切都是函数,这一规则产生两个重要影响:
首先,您已经看到,函数可以作为对象进行操纵和存储。这使函数具有强大的可重用性,本系列 第一篇文章 对此作了探讨。
第二个影响是,Scala 语言设计者提供的操作符与 Scala 程序员认为应该 提供的操作符之间没有特别的差异。例如,假设提供一个 “求倒数” 操作符,这个操作符会将分子和分母调换,返回一个新的 Rational (即对于 Rational(2,5) 将返回 Rational(5,2))。如果您认为 ~ 符号最适合表示这个概念,那么可以使用此符号作为名称定义一个新方法,该方法将和 Java 代码中任何其他操作符一样,如清单 5 所示:
清单 5. 求倒数
val r6 = ~r1
Console.println(r6) // should print [3 / 1], since r1 = [1 / 3]