前言: 学习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