欢迎关注我的新博客地址:http://cuipengfei.me/

在Scala中,名字叫做update的方法是有特殊作用的。

比如:

1
2
3
val scores = new scala.collection.mutable.HashMap[String, Int]
scores("Bob") = 100
val bobsScore = scores("Bob")

以上三行代码,我们创建了一个可变的map来存储得分情况,然后我们记录了Bob的得分是100分,最后我们又把Bob的分数取出来了。

这三行代码看似平淡无奇,实则暗藏了一点点玄机。

第二行实际是调用了HashMap的update方法。

第三行实际是调用了HashMap的apply方法。

我们可以把上面的代码改写成下面的等价形式:

1
2
3
val scores = new scala.collection.mutable.HashMap[String, Int]
scores.update("Bob", 100)
val bobsScore = scores.apply("Bob”)

虽然等价,但是可读性却降低了一些。

apply方法我们之前讲过,就不再赘述。

update方法也不太复杂,它的规则就是:

1
x(y) = z

这样的代码会被编译为:

1
x.update(y, z)

这次博文名字虽然以抹掉糖衣开头,实则有点名不符实,因为这个语言特性过于简单,糖衣很薄,一抹就透。

这次的目的主要是介绍一个update方法的适用场景。

我们来看用来修改某个人地址的一段代码:

1
2
3
4
5
6
7
8
class AddressChanger {

  def update(name: String, age: Int, newAddress: String) = {
println(s"changing address of $name, whose age is $age to $newAddress")
//actually change the address
} }

我们可以这样来调用它:

1
2
val changer = new AddressChanger()
changer.update("xiao ming", 23, "beijing")

或者,我们也可以这样来调用它:

1
2
val addressOf = new AddressChanger()
addressOf(name = "xiao ming", age = 23) = "beijing"

这两段代码是等价的。

比较一下,前一种用法显得中规中矩,没什么特别好的,也没啥特大的毛病。

可是后一种用法就不同了,读起来很通顺,有读英语语句的感觉:把名字叫做小明,年龄23岁的人的地址改为北京。

如果再给AddressChanger加上一个apply方法,我们还可以写这样的代码:

1
val currentAddress = addressOf(name = "xiao ming", age = 23)

这样,读取和更新的代码都看起来非常自然。

如果我们把这两段代码连起来看:

1
2
val currentAddress = addressOf(name = "xiao ming", age = 23)
addressOf(name = "xiao ming", age = 23) = "beijing"

感觉甚好。

addressOf(name = “xiao ming”, age = 23)可以看做一个整体,它就如同一个可读可写的属性。

我们把它放到赋值语句的右侧,就能取到小明的当前住址。

我们把它放到赋值语句的左侧,就能修改小明的住址。

apply和update都是蛮简单的语言特性,但是加以合适的应用,却能得到可读性极强的代码。

抹掉Scala的糖衣(14) -- Update Method的更多相关文章

  1. 去掉Scala的糖衣(4) -- Type Aliase

    我的新博客地址:http://cuipengfei.me/blog/2013/12/23/desugar-scala-4/ Scala中有一个type关键字,用来给类型或者是操作起别名,用起来很是方便 ...

  2. 【scala】apply和update

    我们在使用scala的时候经常会用到对象的apply方法和update方法. 虽然我们表面没有察觉,但是实际上两个方法都会遵循相关约定被调用. apply apply方法的约定:用括号传递给变量(对象 ...

  3. 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") ...

  4. 除去Scala的糖衣(13) -- Default Parameter Value

    欢迎关注我的新博客地址:http://cuipengfei.me/ 好久没有写博客了,上一次更新竟然是一月份. 说工作忙都是借口,咋有空看美剧呢. 这半年荒废掉博客说到底就是懒,惯性的懒惰.写博客这事 ...

  5. scala学习手记14 - 单例对象

    java中的单例模式都很熟悉了:简单地说就是一个类只能有一个实例.在scala中创建单例对象非常简单,创建类时使用object关键字替换class即可.因为单例类无法初始化,所以不能向它的主构造函数传 ...

  6. Scala 中的 apply 和 update 方法[转]

    原文链接:http://blog.csdn.net/lyrebing/article/details/21696581 Scala 是构建在 JVM 上的静态类型的脚本语言,而脚本语言总是会有些约定来 ...

  7. 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 ...

  8. 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 ...

  9. Beginning Scala study note(3) Object Orientation in Scala

    1. The three principles of OOP are encapsulation(封装性), inheritance(继承性) and polymorphism(多态性). examp ...

随机推荐

  1. Sqlserver获取行号

    Sqlserver获取行号   select row_number()over(order by userid )as RowNum,*from OUM_User

  2. 【iOS开发-59】LOL案例:单组tabView、alertView样式、实现监听,以及用reloadData数据刷新

    案例效果: (1)先在storyboard中拖拽出一个tableView,然后下面用代码. --tableView继承自scrollView.所以自然有滚动的特性 --最基本的还是数据转模型.以及对c ...

  3. 公共DNS服务

    一: 谷歌的 8.8.8.8 8.8.4.4 国内的两组 114.114.114.114 114.114.115.115

  4. 【Unity优化】怎样实现Unity编辑器中的协程

    Unity编辑器中何时须要协程 当我们定制Unity编辑器的时候,往往须要启动额外的协程或者线程进行处理.比方当运行一些界面更新的时候,须要大量计算,假设用户在不断修正一个參数,比方从1变化到2.这种 ...

  5. unix 网络编程 第七章

    1     getsockopt和setsockopt函数 套接字选项粗分为两大基本类型:一是启用或禁止某个特性的二元选项,二是取得并返回特定值的选项,参数都是以指针形式传入的. 2     套接字状 ...

  6. js 向上取整、向下取整、四舍五入

      js 向上取整.向下取整.四舍五入 CreateTime--2018年4月14日11:31:21 Author:Marydon // 1.只保留整数部分(丢弃小数部分) parseInt(5.12 ...

  7. jquery获取含有某元素的的控件 “控件名[属性名=值]”

    jquery获取含有某元素的的控件 “控件名[属性名=值]”. 如,获取 <input id="${cheackbox}" data-role="icheck&qu ...

  8. 转:TCP/IP协议选项——TCP_KEEPALIVE .

    [+] KEEPALIVE作用 KEEPALIVE代码示例 KEEPALIVE脚本设置   1.KEEPALIVE作用 KEEPALIVE机制,是TCP协议规定的TCP层(非应用层业务代码实现的)检测 ...

  9. 每秒处理3百万请求的Web集群搭建-为最佳性能调优 Nginx

    这篇文章是<打造3百万次请求/秒的高性能服务器集群>系列的第2部分,在这个部分中你可以使用任何一种 WEB 服务器,不过我决定使用 Nginx,因其轻量级.高可靠及高性能的优点. 通常来说 ...

  10. Linux-软件包管理-rpm命令管理-校验、文件提取

    rpm -V httpd 查看已安装的apache包中文件信息是否已经被人修改 rpm -ql httpd 查看已安装的apache包中文件的位置 vim /etc/httpd/conf/httpd. ...