官术网_书友最值得收藏!

6.12 擴展方法

現在你已經可以寫r * 2,但是你可能還想交換兩個操作元的位置,即2 * r。很遺憾,這樣還不行:

這里的問題是2 * r等價于2.*(r),因此這是一個對2這個整數的方法調用。但Int類并沒有一個接收Rational參數的乘法方法(它無法有這樣一個方法,因為Rational類并不是Scala類庫中的標準類)。

不過,Scala有另外一種方式來解決這個問題:可以為Int類創建一個接收有理數的擴展方法。可以向編譯器里添加行:

這將會為Int類定義4個擴展方法,每個擴展方法都接收Rational參數作為入參。編譯器可以在若干場合自動選用這些方法。有了這些擴展方法的定義,就可以重新嘗試之前失敗的示例:

為了讓擴展方法能夠正常工作,要求它在作用域內。如果你將擴展方法的定義放在Rational類內部,則對編譯器而言,擴展方法并沒有在作用域內。就目前而言,你需要在編譯器中直接定義擴展方法。

就像從示例中看到的那樣,擴展方法是讓類庫變得更靈活、更便于使用的強大技巧。由于它非常強大,因此很容易被濫用。你會在第22章找到更多關于擴展方法的細節,包括如何在需要時將它引入作用域內。

主站蜘蛛池模板: 天镇县| 昌图县| 习水县| 德江县| 横山县| 崇礼县| 七台河市| 靖宇县| 江华| 昭觉县| 宝清县| 莎车县| 水城县| 福安市| 林周县| 和硕县| 基隆市| 嘉黎县| 清水河县| 商河县| 宣汉县| 景洪市| 高安市| 鹤岗市| 平遥县| 阳春市| 陆丰市| 利津县| 玉环县| 南漳县| 吉木萨尔县| 滦南县| 衡山县| 桦甸市| 宜章县| 莱州市| 安宁市| 宣威市| 城固县| 阿尔山市| 淳安县|