抹掉Scala的糖衣(14) -- Update Method
欢迎关注我的新博客地址:http://cuipengfei.me/
在Scala中,名字叫做update的方法是有特殊作用的。
比如:
1 |
|
以上三行代码,我们创建了一个可变的map来存储得分情况,然后我们记录了Bob的得分是100分,最后我们又把Bob的分数取出来了。
这三行代码看似平淡无奇,实则暗藏了一点点玄机。
第二行实际是调用了HashMap的update方法。
第三行实际是调用了HashMap的apply方法。
我们可以把上面的代码改写成下面的等价形式:
1 |
|
虽然等价,但是可读性却降低了一些。
apply方法我们之前讲过,就不再赘述。
update方法也不太复杂,它的规则就是:
1 |
|
这样的代码会被编译为:
1 |
|
这次博文名字虽然以抹掉糖衣开头,实则有点名不符实,因为这个语言特性过于简单,糖衣很薄,一抹就透。
这次的目的主要是介绍一个update方法的适用场景。
我们来看用来修改某个人地址的一段代码:
1 |
|
我们可以这样来调用它:
1 |
|
或者,我们也可以这样来调用它:
1 |
|
这两段代码是等价的。
比较一下,前一种用法显得中规中矩,没什么特别好的,也没啥特大的毛病。
可是后一种用法就不同了,读起来很通顺,有读英语语句的感觉:把名字叫做小明,年龄23岁的人的地址改为北京。
如果再给AddressChanger加上一个apply方法,我们还可以写这样的代码:
1 |
|
这样,读取和更新的代码都看起来非常自然。
如果我们把这两段代码连起来看:
1 |
|
感觉甚好。
addressOf(name = “xiao ming”, age = 23)可以看做一个整体,它就如同一个可读可写的属性。
我们把它放到赋值语句的右侧,就能取到小明的当前住址。
我们把它放到赋值语句的左侧,就能修改小明的住址。
apply和update都是蛮简单的语言特性,但是加以合适的应用,却能得到可读性极强的代码。
抹掉Scala的糖衣(14) -- Update Method的更多相关文章
- 去掉Scala的糖衣(4) -- Type Aliase
我的新博客地址:http://cuipengfei.me/blog/2013/12/23/desugar-scala-4/ Scala中有一个type关键字,用来给类型或者是操作起别名,用起来很是方便 ...
- 【scala】apply和update
我们在使用scala的时候经常会用到对象的apply方法和update方法. 虽然我们表面没有察觉,但是实际上两个方法都会遵循相关约定被调用. apply apply方法的约定:用括号传递给变量(对象 ...
- scala - multiple overloaded alternatives of method bar define default arguments
同名同位置默认参数不能overload def bar(i:Int,s:String="a"){} def bar(i:String,s:String="b") ...
- 除去Scala的糖衣(13) -- Default Parameter Value
欢迎关注我的新博客地址:http://cuipengfei.me/ 好久没有写博客了,上一次更新竟然是一月份. 说工作忙都是借口,咋有空看美剧呢. 这半年荒废掉博客说到底就是懒,惯性的懒惰.写博客这事 ...
- scala学习手记14 - 单例对象
java中的单例模式都很熟悉了:简单地说就是一个类只能有一个实例.在scala中创建单例对象非常简单,创建类时使用object关键字替换class即可.因为单例类无法初始化,所以不能向它的主构造函数传 ...
- Scala 中的 apply 和 update 方法[转]
原文链接:http://blog.csdn.net/lyrebing/article/details/21696581 Scala 是构建在 JVM 上的静态类型的脚本语言,而脚本语言总是会有些约定来 ...
- Spring ’14 Wave Update: Installing Dynamics CRM on Tablets for Windows 8.1
One of the added bonuses of Dynamics CRM is its ability go where you go! With the Spring ’14 Wave Up ...
- How do I iterate over a Scala List (or more generally, a sequence) using theforeach method or for loop?
Scala List/sequence FAQ: How do I iterate over a Scala List (or more generally, a sequence) using th ...
- Beginning Scala study note(3) Object Orientation in Scala
1. The three principles of OOP are encapsulation(封装性), inheritance(继承性) and polymorphism(多态性). examp ...
随机推荐
- Linux系统攻略 用UUID在Fstab中挂载分区
Fstab 文件大家都很熟悉,Linux 在启动的时候通过 fstab 中的信息挂载各个分区,一个典型的分区条目就像这样: /dev/sdb5 /mnt/usb vfat utf8,umask=0 0 ...
- 微信小程序 - 自定义模态对话框
更新日期:2018-11-5 微信bug: 在for循环中使用组件时,遮罩层成黑层. 更新时间 2018-9-30 2018-9-30 1.在电脑上调试input超出输入框范围会出现文字模糊以及位移现 ...
- 安装SQL SERVER 2016 CTP (二)[多图]
内容中包含 base64string 图片造成字符过多,拒绝显示
- Android SDK镜像的介绍使用【转发】
由于一些原因,Google相关很多服务都无法访问,所以在很多时候我们SDK也无法升级,当然通过技术手段肯定可以解决,但是比较麻烦,而且下载速度也不怎么样. 这里笔者介绍一个国内的Android镜像站, ...
- proc文件系统分析
来源: ChinaUnix博客 日期: 2008.01.03 11:46 (共有条评论) 我要评论 二 proc文件系统分析 根据前面的分析,我们可以基本确定对proc文件系统的分析步骤.我将按 ...
- js特效,轻松实现内容的无缝平滑滚动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...
- HTML5学习笔记 拖放
拖放(Drag和drop)是html5标准的组成部分 拖放是一种常见的特性,即抓取对象以后拖到另一个位置 在html5中,拖放是标准一部分,任何元素都能够拖放. 设置元素为可拖放 首先,为了使元素可拖 ...
- .net core +codefirst(.net core 基础入门,适合这方面的小白阅读) 【我们一起写框架】领域驱动设计的CodeFirst框架(一)—序篇
.net core +codefirst(.net core 基础入门,适合这方面的小白阅读) 前言 .net core mvc和 .net mvc开发很相似,比如 视图-模型-控制器结构.所以. ...
- XMLDocument转为String 摘录
public static string FormatXmlString(string xmlString) { XmlDocument document = new XmlDocument(); d ...
- JEECG环境搭建(Maven版本)-总结Eclipse
1.安装sql server 数据库: 解决办法: 控制面板→程序和功能→启用或关闭Windows功能 .Net Framework 3.5这一项未被完全选中(应为对勾,如果是方块也不可以) 选中该项 ...