上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
6.12 扩展方法
现在你已经可以写r * 2,但是你可能还想交换两个操作元的位置,即2 * r。很遗憾,这样还不行:
这里的问题是2 * r等价于2.*(r),因此这是一个对2这个整数的方法调用。但Int类并没有一个接收Rational参数的乘法方法(它无法有这样一个方法,因为Rational类并不是Scala类库中的标准类)。
不过,Scala有另外一种方式来解决这个问题:可以为Int类创建一个接收有理数的扩展方法。可以向编译器里添加行:
这将会为Int类定义4个扩展方法,每个扩展方法都接收Rational参数作为入参。编译器可以在若干场合自动选用这些方法。有了这些扩展方法的定义,就可以重新尝试之前失败的示例:
为了让扩展方法能够正常工作,要求它在作用域内。如果你将扩展方法的定义放在Rational类内部,则对编译器而言,扩展方法并没有在作用域内。就目前而言,你需要在编译器中直接定义扩展方法。
就像从示例中看到的那样,扩展方法是让类库变得更灵活、更便于使用的强大技巧。由于它非常强大,因此很容易被滥用。你会在第22章找到更多关于扩展方法的细节,包括如何在需要时将它引入作用域内。