原文链接:http://blog.csdn.net/lyrebing/article/details/21696581

Scala 是构建在 JVM 上的静态类型的脚本语言,而脚本语言总是会有些约定来增强灵活性。灵活性可以让掌握了它的人如鱼得水,也会让初学者不知所措。比如说 Scala 为配合 DSL 在方法调用时有这么一条约定:

在明确了方法调用的接收者的情况下,若方法只有一个参数时,调用的时候就可以省略点及括号。如 “0 to 2”,实际完整调用是 “0.to(2)”。但 “println(2)” 不能写成 “println 10“”,因为未写出方法调用的接收者 Console,所以可以写成 “Console println 10”

到这里就要讲到 apply 和 update 方法相关的约定,描述的是直接在变量(对象)后直接加圆括号的代码的情况下,那就是:

用括号传递给变量(对象)一个或多个参数时,Scala 会把它转换成对 apply 方法的调用;与此相似的,当对带有括号并包括一到若干参数的变量(对象)进行赋值时,编译器将使用对象的 update 方法对“括号里的参数和等号右边的值”执行调用。

对上面那段话的解释可由下面几个例子得到很好的理解

1. theArray(0), 取数组的第一个元素的操作会转换成 theArray.apply(0) 操作,这也能解释为什么 Scala 数组取值不用中括号括下标的方式,因为它也是一次方法调用

2. anyObject("key1") 会被转换成 anyObject.apply("key") 操作,这也会让我们想到 Map 的取值操作,的确如此。我们可以作个例子:

  1. classSomeClass {
  2. defapply(key:String):String ={
  3. println("apply method called, key is: " + key)
  4. "Hello World!"
  5. }
  6. }
  7. valanyObject =new SomeClass
  8. println(anyObject("key1"))

执行后输出结果是:

apply method called, key is: key1
Hello World!

说明是调用到了相应的 apply 方法的。

3. 我们在构造 Array 或  Map 时,会简单的写成

  1. valnumNames =Array("zero","one","two")

这里也是调用的 apply 方法,我们看起来好像是作用在类 Array 上的,其实不然,而是作用在 Array 的伴生对象(object Array)上的,调用的是伴生对象 Array 的  apply 方法,即:

  1. valnumNames =Array.apply("zero","one","two")

上面的功效像是调用的 Array 类的 apply 工厂方法。同样看个单例对象的例子,也解释了伴生对象的 apply 方法的调用

  1. objectEMail {
  2. defapply(user:String, domain:String):String ={
  3. println("apply method called")
  4. user + "@"+ domain
  5. }
  6. }
  7. valemail =EMail("lyrebing","hotmail.com")
  8. println(email)

上面代码执行后输出结果是:

apply method called
lyrebing@hotmail.com

有了前面 apply 方法的理解,下面对 update 方法的理解就很顺畅了,比如:

  1. greetStrings(0)="Hello"

会转换成调用

  1. greetStrings.update(0,"Hello")

来个复杂的 Demo,赋值时等号左边带两个参数,并且赋值操作会产生返回值的情况(纯粹用于演示)

  1. classSomeClass {
  2. defupdate(arg1:Int, arg2:String, arg3:String):String ={
  3. println("update method called")
  4. arg1+ "|"+ arg2+ "|"+ arg3
  5. }
  6. }
  7. valobj =new SomeClass
  8. valresult =(obj(1,"key1")="Hello")
  9. println(result)

执行后输出结果为:

update method called
1|key1|Hello

在应用 apply 和 update 规则时,关键是转换后的调用要找到相应的方法原型。再就是应用 update 时,等号右边的值会作为 update 方法的最后一个参数。

Scala 中的 apply 和 update 方法[转]的更多相关文章

  1. Hibernate中的session对象update方法的使用

    使一个游离对象转变为持久化对象.例如以下代码在session1中保存了一个Customer对象,然后在session2中更新这个Customer对象: Customer customer = new ...

  2. SpriteKit中为何不要在update方法中测试碰撞

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们若要在游戏中做碰撞检测有2种办法,一是利用物理引擎,二是自 ...

  3. Scala 中的foreach和map方法比较

    Scala中的集合对象都有foreach和map两个方法.两个方法的共同点在于:都是用于遍历集合对象,并对每一项执行指定的方法.而两者的差异在于:foreach无返回值(准确说返回void),map返 ...

  4. 关于Cocos2d-x中的scheduleUpdate和update方法的使用

    一.如果要让某类实例对象要连续执行某些语句(比如让每个Block实例从运行框最右边移动到最左边) 要在Block类中增加一些东西 1.先在其.cpp文件的init()函数中执行scheduleUpda ...

  5. Scala中的apply实战详解

    apply可以应用与Object和Class,单调用情景不一样. 通过Array(1,2,3,4,5) 可以调用到Array中的.appy方法.你可以看源码是如何实现apply的. 类中的appy比较 ...

  6. javascript 中的apply()和call()方法详解

    1.语法 先来看看JS手册中对call的解释: call 方法 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, [,.argN]]]]]) ...

  7. pandas | 详解DataFrame中的apply与applymap方法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是pandas数据处理专题的第5篇文章,我们来聊聊pandas的一些高级运算. 在上一篇文章当中,我们介绍了panads的一些计算方法, ...

  8. Unity3D 中的三个Update()方法

            MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. MonoBehaviour.FixedUpdate 固定更新 当Mo ...

  9. Scala中的Apply

    文章来自:http://www.cnblogs.com/hark0623/p/4194940.html  转载请注明 /** * Created by Administrator on 2014-12 ...

随机推荐

  1. 使用 Aspose.Cells 实现 excel导入

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  2. java开发是否一定要使用三层结构

    从开始学习java的时候,爷爷的爷爷就教导我们,要使用三层结构去开发结构明细,低耦合,高可用的项目.但是具体开发中,每新建一张表,就要新建BO,dao层,服务层,而新建这5,6个类也许仅仅只为了实现一 ...

  3. 淘宝ued - 前端智勇大闯关(第三季)答案(更新)

    淘宝ued - 前端智勇大闯关(第三季)答案(更新) 下午在微博上看到了淘宝智勇大闯关第三季的信息,感觉挺有意思的,于是就尝试做了下.附上题目地址: http://ued.campus.alibaba ...

  4. 使用 Python 开始游戏开发

    使用 Python 开始游戏开发 这是一篇由教程团队成员Julian Meyer发表的文章,一个12岁的python开发人员.你可以在Google+和Twitter上找到他. 你可曾想过如何创建视频游 ...

  5. 使用diff和patch指令生成文件差异和还原文件

    使用diff和patch指令生成文件差异和还原文件 创建一个新的文件夹test然后进入test mkdir test cd test 首先创建文件a vim a.txt 随便输入一段文字后保存不退出. ...

  6. sftp 服务器外网访问设置

    这个是需要在本机上设定用户名的.根据不同的用户权限.然后让不同的人来到本机上取得数据. 参考一下有用的文章:http://www.ericstockwell.com/?p=54       (强烈建议 ...

  7. 基于内容的图片检索CBIR(Content Based Image Retrieval)简介

    传统的图像检索过程,先通过人工对图像进行文字标注,再利用关键字来检索图像,这种依据图像描述的字符匹配程度提供检索结果的方法,简称“以字找图”,既耗时又主观多义.基于内容的图像检索客服“以字找图”方式的 ...

  8. x86中的页表结构和页表项格式

    一.页表结构 分页转换功能由驻留在内存中的表来描述,该表称为页表(page table),存放在物理地址空间中.页表可看做简单的220个物理地址数组.线性到物理地址的映射功能可以简单地看做进行数组查找 ...

  9. Nginx 防止被域名恶意解析的方法

    今天太倒霉了,发现通过IP无法访问服务器的80端口很无语,昨天都还好的啊,也没有修改过配置,其他端口又是正常的,防火墙也没问题.于是问了下机房,给了个崩溃的回复说我们的服务器有个域名没有备案被电信多次 ...

  10. elasticsearch查询模板

    { "from":#from#, "size":#size#, "_source":#source#, "query": ...