中文代碼示例[譯]Scala中創建隱式函數
前言: 學習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("
第二步: 創建隱式函數把String轉換為封裝類")object 包子轉換 { implicit def 文本到包子名稱(名稱: String) = new 包子名稱(名稱)}
注:
隱式函數與其他函數定義唯一區別就是前面有implicit
關鍵詞
3. 導入轉換函數進入作用域
為了使用第二步中定義的隱式函數, 需要將它納入作用域. 這需要import
關鍵詞:
println("
第三步: 導入轉換函數進入作用域")import 包子轉換._
注:
導入中使用的_
通配符可以導入所有值或隱式函數
4. 建文本常量
建了兩個文本常量:
println("
第四步: 建文本常量")val 菜包 = "香菇菜包"val 肉包 = "白菜肉包"
5. 如何調用自定義的最愛吃的包子
簡單:
println("
第五步")println(s"愛吃菜包嗎 = ${菜包.最愛吃的包子}")println(s"愛吃肉包嗎 = ${肉包.最愛吃的包子}")
運行後應該得到:
第五步愛吃菜包嗎 = true愛吃肉包嗎 = false
注:
最愛吃的包子
像是String
類自帶的函數- 但並不用修改
String
類的源碼 - 而是用Scala的隱式函數來擴展了
String
類
本節教程結束, 希望有所幫助.
譯後感
- 翻譯比想像中耗時
推薦閱讀:
※如何看待reactive web框架Binding.scala ?
※Scala快速入門-4-常用映射和元組操作
※Vert.x各種語言中的Lambda寫法
※如何评价Functional Programming in Scala 这本书?