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("\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中创建隐式函数的更多相关文章
- Scala 中的隐式转换和隐式参数
隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义. 举例: 正常情况下"120"/12显然会报错,因为 String 类并没有实现 / 这个方法,我们无法去决定 Stri ...
- 2018-06-20 中文代码示例视频演示Python入门教程第四章 控制流
知乎原链 续前作: 中文代码示例视频演示Python入门教程第三章 简介Python 对应在线文档: 4. More Control Flow Tools 录制中出了不少岔子. 另外, 输入法确实是一 ...
- 2018-12-09 疑似bug_中文代码示例之Programming in Scala笔记第九十章
续前文: 中文代码示例之Programming in Scala笔记第七八章 源文档库: program-in-chinese/Programming_in_Scala_study_notes_zh ...
- 2018-11-27 中文代码示例之Programming in Scala笔记第七八章
续前文: 中文代码示例之Programming in Scala学习笔记第二三章 中文代码示例之Programming in Scala笔记第四五六章. 同样仅节选有意思的例程部分作演示之用. 源文档 ...
- 2018-11-16 中文代码示例之Programming in Scala笔记第四五六章
续前文: 中文代码示例之Programming in Scala学习笔记第二三章. 同样仅节选有意思的例程部分作演示之用. 源文档仍在: program-in-chinese/Programming_ ...
- 中文代码示例之NW.js桌面应用开发初体验
先看到了NW.js(应该是前身node-webkit的缩写? 觉得该起个更讲究的名字, 如果是NorthWest之意的话, logo(见下)里的指南针好像也没指着西北啊)和Electron的比较文章: ...
- 中文代码示例之Angular入门教程尝试
原址: https://zhuanlan.zhihu.com/p/30853705 原文: 中文代码示例教程之Angular尝试 为了检验中文命名在Angular中的支持程度, 把Angular官方入 ...
- 中文代码示例之Vuejs入门教程(一)
原址: https://zhuanlan.zhihu.com/p/30917346 为了检验中文命名在主流框架中的支持程度, 在vuejs官方入门教程第一部分的示例代码中尽量使用了中文命名. 所有演示 ...
- 2018-08-11 中文代码示例之Spring Boot 2.0.3问好
上次试用Spring Boot还是两年前: 中文代码示例之Spring Boot 1.3.3演示. 打算用在一个讨论组内小项目上, 于是从官网Building an Application with ...
随机推荐
- Android开发 - Retrofit 2 使用自签名的HTTPS证书进行API请求
为了确保数据传输的安全,现在越来越多的应用使用Https的方式来进行数据传输,使用https有很多有点,比如: HTTPS协议是由SSL+HTTP协议构建的可进行加密传输.身份认证的网络协议,要比ht ...
- Spring Data Solr的分组查询 for 搜索面板的商品分类
private List searchCategoryList(Map searchMap) { SimpleQuery query = new SimpleQuery(new Criteria(&q ...
- eclipse——JDK安装与环境变量配置步骤
第一次接触eclipse的时候,让我自己安装jdk和配置环境变量,我是懵逼的,后来百度到找到了一个比较详细的引导,本人测试没问题,截图按步骤如下: JDK安装 步骤1: 步骤2: 配置环境变量 步 ...
- Swift5 语言指南(四) 基础知识
Swift是iOS,macOS,watchOS和tvOS应用程序开发的新编程语言.尽管如此,Swift的许多部分对您在C和Objective-C中的开发经验都很熟悉. 雨燕提供了自己的所有基本C和Ob ...
- 怎样提供一个好的移动API接口服务/从零到一[开发篇]
引语:现在互联网那么热,你手里没几个APP都不好意思跟别人打招呼!但是,难道APP就是全能的神吗?答案是否定的,除了优雅的APP前端展示,其实核心还是服务器端.数据的保存.查询.消息的推送,无不是在服 ...
- Testing - 软件测试知识梳理 - 比较质量保证(QA)与质量控制(QC)
QA QC QM 概念 Quality Assurance (质量保证) Quality Control (质量控制) Quality Manage (质量管理) 定义 为达到质量要求所采取的作业技术 ...
- 机器学习基石笔记:09 Linear Regression
线性回归假设: 代价函数------均方误差: 最小化样本内代价函数: 只有满秩方阵才有逆矩阵. 线性回归算法流程: 线性回归算法是隐式迭代的. 线性回归算法泛化可能的保证: 根据矩阵的迹的性质:tr ...
- LeetCode:151_Reverse Words in a String | 字符串中单词的逆反 | Medium
题目:Reverse Words in a String Given an input string, reverse the string word by word. For example, Gi ...
- A Nice Paper About Mobile Data Offloading
关于Mobile Data Offloading这个研究领域的Paper基本上该有的都看过了,我想即使再有也无非是那些套路,新不到哪去.同样,这篇paper也是这样,它的出发点是改进原有的利用ad h ...
- Mobility Model and Routing Model about the ONE
ONE主要的功能是节点的移动,节点间的相遇情况,路由情况以及消息的处理机制.下面简要介绍下目前ONE自带的六种移动模型和六种路由模型. Mobility Model: 从大的方面,可以分为三种,1)随 ...