欢迎关注我的新博客地址: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. 无法将“<s:SimpleText>”解析为组件执行

    导入以前版本的flex代码时,报"无法将“<s:SimpleText>”解析为组件执行"错误: 后来在网上找到解决方案,即版本更新的一段话: 网址是:https://f ...

  2. android-文字的处理-随心

    一.计算文字的大小 String timeStr = "00:00"; int textWidth = (int)Layout.getDesiredWidth(timeStr, 0 ...

  3. Java程序实现密钥库的维护

    1 Java程序列出密钥库所有条目 import java.util.*; import java.io.*; import java.security.*; public class ShowAli ...

  4. Array.prototype.slice.call 和 slice以及call

    单独的简单介绍,后续再补上一些资料. 对象转换为数组. /** * slice : 数组->slice(截取) * 参数有两个,开始截取和结束截取,并返回原数组: * a.slice(1) || ...

  5. InnerHTML属性的XSS利用

    来自:http://www.myhack58.com/Article/html/3/7/2011/32395.htm innerHTML 是个奇怪的HTML属性,不是W3C标准支持的,但几乎所有的厂商 ...

  6. 关于图片无缝拼接的学习(PTGui)

    一.简介 在用到单反.无人机.手机等拍照工具,需要无缝拼接. 二.下载 官网:http://www.ptgui.com/download.html 其他:http://pan.baidu.com/sh ...

  7. 17、Cocos2dx 3.0游戏开发找小三之内置的经常使用层:三剑客LayerColor、LayerGradient、Menu

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30477587 为了方便游戏开发人员.Cocos2d- ...

  8. PHP权限控制(转)

    PHP: 我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到"位运行符"操作,& 位与运算符.| 位或运行符.参与运算的如果是10进制数,则会被转换至2进制数参与运 ...

  9. maple minimax函数

    numapprox[minimax] - minimax rational approximation Calling Sequence   minimax(f, x=a..b, [m, n], w, ...

  10. [Jobdu] 题目1504:把数组排成最小的数

    题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 输入: 输 ...