• 2018-02-17 中文代码示例[译]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类

    本节教程结束, 希望有所帮助.

    译后感

    • 翻译比想象中耗时
  • 相关阅读:
    Java性能总结一(转)
    Java性能总结三(转)
    Java性能总结二(转)
    Jsp设计第三版文摘
    java配置错误记录
    PatternsInJava文摘
    Java性能总结四(转)
    Spring+Struts+Hibernate 简介(转)
    baidu c++吧上的一道题
    IT公司笔试题总结(三)
  • 原文地址:https://www.cnblogs.com/program-in-chinese/p/10489396.html
Copyright © 2020-2023  润新知