前言: 學習Scala時, 順便翻譯一下本身有興趣的文章. 代碼中全部命名都中文化了(不是翻譯). 好比原文用的是甜甜圈的例子.bash
原文: Scala Tutorial - Learn How To Create Implicit Functionmarkdown
本文學習如何建立隱式函數, 以便對幾乎任何類型實現擴展方法或函數.函數
正如其名, Scala設計時就最大化了可擴展性. Scala features tutorial提到用implicit能夠方便地實現任何類型的擴展方法或函數.oop
對以前的教程的包子鋪例子, 這裏擴展String類使它有最愛吃的包子()函數.學習
咱們建立一個簡單的封裝類, 以String爲參數, 並提供這個最愛吃的包子函數spa
println("第一步: 建立封裝類以便擴展String類型") class 包子名稱(名稱: String) { def 最愛吃的包子: Boolean = 名稱 == "香菇菜包" } 複製代碼
(原文, 下同)注:scala
看到Scala能夠用==而不是equals比較字符串, Java或者.NET的開發者也許會驚喜翻譯
把隱式函數封裝到object實現的單例中是個好習慣. 也能夠用以後教程中的package object實現.設計
下面, 就定義了一個隱式函數將String做參數並建立一個封裝類的實例:code
println("\n第二步: 建立隱式函數把String轉換爲封裝類") object 包子轉換 { implicit def 文本到包子名稱(名稱: String) = new 包子名稱(名稱) } 複製代碼
注:
隱式函數與其餘函數定義惟一區別就是前面有implicit關鍵詞
爲了使用第二步中定義的隱式函數, 須要將它歸入做用域. 這須要import關鍵詞:
println("\n第三步: 導入轉換函數進入做用域") import 包子轉換._ 複製代碼
注:
導入中使用的_通配符能夠導入全部值或隱式函數
建了兩個文本常量:
println("\n第四步: 建文本常量") val 菜包 = "香菇菜包" val 肉包 = "白菜肉包" 複製代碼
簡單:
println("\n第五步") println(s"愛吃菜包嗎 = ${菜包.最愛吃的包子}") println(s"愛吃肉包嗎 = ${肉包.最愛吃的包子}") 複製代碼
運行後應該獲得:
第五步 愛吃菜包嗎 = true 愛吃肉包嗎 = false 複製代碼
注:
本節教程結束, 但願有所幫助.
2018-02-17