中文程式碼示例[譯]Scala中建立隱式函式
阿新 • • 發佈:2019-01-08
前言: 學習Scala時, 順便翻譯一下自己有興趣的文章. 程式碼中所有命名都中文化了(不是翻譯). 比如原文用的是甜甜圈的例子.
原文: Scala Tutorial - Learn How To Create Implicit Function
簡述
本文學習如何建立隱式函式, 以便對幾乎任何型別實現擴充套件方法或函式.
正如其名, Scala設計時就最大化了可擴充套件性. Scala features tutorial提到用implicit可以方便地實現任何型別的擴充套件方法或函式.
對之前的教程的包子鋪例子, 這裡擴充套件String類使它有最愛吃的包子()函式.
步驟
1. 建立String的封裝類
我們建立一個簡單的封裝類, 以String為引數, 並提供這個最愛吃的包子函式
println("第一步: 建立封裝類以便擴充套件String型別")
class 包子名稱(名稱: String) {
def 最愛吃的包子: Boolean = 名稱 == "香菇菜包"
}
(原文, 下同)注:
看到Scala可以用==而不是equals比較字串, Java或者.NET的開發者也許會驚喜
2. 如何建立隱式函式把String轉換成封裝類
把隱式函式封裝到object實現的單例中是個好習慣. 也可以用之後教程中的package object實現.
下面, 就定義了一個隱式函式將String作引數並建立一個封裝類的例項:
println("\n第二步: 建立隱式函式把String轉換為封裝類")
object 包子轉換 {
implicit def 文字到包子名稱(名稱: String) = new 包子名稱(名稱)
}
注:
隱式函式與其他函式定義唯一區別就是前面有implicit關鍵詞
3. 匯入轉換函式進入作用域
為了使用第二步中定義的隱式函式, 需要將它納入作用域. 這需要import關鍵詞:
println("\n第三步: 匯入轉換函式進入作用域")
import 包子轉換._
注:
匯入中使用的_萬用字元可以匯入所有值或隱式函式
4. 建文字常量
建了兩個文字常量:
println("\n第四步: 建文字常量")
val 菜包 = "香菇菜包"
val 肉包 = "白菜肉包"
5. 如何呼叫自定義的最愛吃的包子
簡單:
println("\n第五步")
println(s"愛吃菜包嗎 = ${菜包.最愛吃的包子}")
println(s"愛吃肉包嗎 = ${肉包.最愛吃的包子}")
執行後應該得到:
第五步
愛吃菜包嗎 = true
愛吃肉包嗎 = false
注:
- 最愛吃的包子像是String類自帶的函式
- 但並不用修改String類的原始碼
- 而是用Scala的隱式函式來擴充套件了String類
本節教程結束, 希望有所幫助.
譯後感
- 翻譯比想象中耗時