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

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

译后感

  • 翻译比想象中耗时

2018-02-17 中文代码示例[译]Scala中创建隐式函数的更多相关文章

  1. Scala 中的隐式转换和隐式参数

    隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义. 举例: 正常情况下"120"/12显然会报错,因为 String 类并没有实现 / 这个方法,我们无法去决定 Stri ...

  2. 2018-06-20 中文代码示例视频演示Python入门教程第四章 控制流

    知乎原链 续前作: 中文代码示例视频演示Python入门教程第三章 简介Python 对应在线文档: 4. More Control Flow Tools 录制中出了不少岔子. 另外, 输入法确实是一 ...

  3. 2018-12-09 疑似bug_中文代码示例之Programming in Scala笔记第九十章

    续前文: 中文代码示例之Programming in Scala笔记第七八章 源文档库: program-in-chinese/Programming_in_Scala_study_notes_zh ...

  4. 2018-11-27 中文代码示例之Programming in Scala笔记第七八章

    续前文: 中文代码示例之Programming in Scala学习笔记第二三章 中文代码示例之Programming in Scala笔记第四五六章. 同样仅节选有意思的例程部分作演示之用. 源文档 ...

  5. 2018-11-16 中文代码示例之Programming in Scala笔记第四五六章

    续前文: 中文代码示例之Programming in Scala学习笔记第二三章. 同样仅节选有意思的例程部分作演示之用. 源文档仍在: program-in-chinese/Programming_ ...

  6. 中文代码示例之NW.js桌面应用开发初体验

    先看到了NW.js(应该是前身node-webkit的缩写? 觉得该起个更讲究的名字, 如果是NorthWest之意的话, logo(见下)里的指南针好像也没指着西北啊)和Electron的比较文章: ...

  7. 中文代码示例之Angular入门教程尝试

    原址: https://zhuanlan.zhihu.com/p/30853705 原文: 中文代码示例教程之Angular尝试 为了检验中文命名在Angular中的支持程度, 把Angular官方入 ...

  8. 中文代码示例之Vuejs入门教程(一)

    原址: https://zhuanlan.zhihu.com/p/30917346 为了检验中文命名在主流框架中的支持程度, 在vuejs官方入门教程第一部分的示例代码中尽量使用了中文命名. 所有演示 ...

  9. 2018-08-11 中文代码示例之Spring Boot 2.0.3问好

    上次试用Spring Boot还是两年前: 中文代码示例之Spring Boot 1.3.3演示. 打算用在一个讨论组内小项目上, 于是从官网Building an Application with ...

随机推荐

  1. 接之前的文章,VS2017中使用Spring.NET配置以及使用方法(framework4.6.1超详细)

    众所周知,Spring在java中是很常见的框架,Spring.Net虽然体积比较大,但是功能相对齐全,本文介绍在VS2017 .Net FrameWork 4.6.1环境下,如何快速使用Spring ...

  2. MyBatis 源码分析 - 映射文件解析过程

    1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...

  3. linux 下动态链接实现原理

    符号重定位 讲动态链接之前,得先说说符号重定位. c/c++ 程序的编译是以文件为单位进行的,因此每个 c/cpp 文件也叫作一个编译单元(translation unit), 源文件先是被编译成一个 ...

  4. Android-如何显示版本号并制作3秒跳转页

    前言 大家好,给大家带来Android-如何显示版本号并制作3秒跳转页的概述,希望你们喜欢 软件技术人员,时代作者,从 Android 到全栈之路,我相信你也可以!阅读他的文章,会上瘾!You and ...

  5. 如何在 SCSS 使用 JavaScript 变量/scss全局变量

    Update2019/3/6:发现一个更好的方法,预处理器加载一个全局设置文件 官方github给出了详细的配置. 在 SCSS 中使用变量很方便,创建一个 variables.scss 文件,里面声 ...

  6. C#6.0语言规范(四) 类型

    C#语言的类型分为两大类:值类型和引用类型.值类型和引用类型都可以是泛型类型,它们采用一个或多个类型参数.类型参数可以指定值类型和引用类型. type : value_type | reference ...

  7. springboot知识点补充(一)

    测试配置 @RunWith(SpringRunner.class) @SpringBootTest @Configuration @ActiveProfiles("test") p ...

  8. 线程间通信wait和notify【All】简介

    1.通信就是指相互交换一些数据或者发送一些控制指令,比如一个线程给另一个暂停执行的线程发送一个恢复执行的指令. 可变共享变量是天然的通信媒介,也就是说一个线程如果想和另一个线程通信的话,可以修改某个在 ...

  9. Jpush极光推送的一些心得

    在集成极光推送的时候,test完全正常.部署到服务器后只发送一条推送之后推送不继续发送.经排查: 2018-06-28 10:24:26.394 [ThreadPoolTaskExecutor-4] ...

  10. xshell 会话管理器快捷键

    有没有发现xshell6关闭左边的会话管理器以后,打开就比较麻烦 那么可以自定义一个快捷键来打开: 然后输入一个快捷键 类型选择 菜单-->然后找会话管理器 完事儿 也可以自定义其他快捷键.自己 ...