我们在使用scala的时候经常会用到对象的apply方法和update方法。

虽然我们表面没有察觉,但是实际上两个方法都会遵循相关约定被调用。

apply

apply方法的约定:用括号传递给变量(对象)一个或多个参数的时候,会把它转换成对apply方法的调用。

我们先看一个例子。

class ClassApplyTest{  //类的apply方法调用示例
def apply(param:String): String ={
println("apply method called,the paramter is "+param);
"Hello,world";//返回值
}
}
object Main{
def main(args:Array[String]): Unit ={
val myApply = new ApplyTest;//实例化ApplyTest
println(myApply("param1"));//传入参数param1
}
}
输出结果 apply method called,the paramter is param1 Hello,world

我们从上个例子看到,我们给ApplyTest类实例一个对象myApply,然后给myapply传入了param1的参数。

过程中并没有调用对象的apply方法,myapply对象自己调用了apply方法。

我们再看一个例子

object SingleObjectApplyTest{//单例对象的apply方法调用示例
def apply(param1:String,param2:String):String = {
println("apply method called");
param1+" and "+param2;
}
def main(args:Array[String]): Unit ={
val myApply = SingleObjectApplyTest("zyh","zqy");
    //注意,我们这里建的是单例对象不是类,并不用new关键字。
println(myApply);
}
}
输出结果 apply method called zyh and zqy

我们定义了一个单例对象,并在对象中定义了apply方法。

当我们建立单例对象并传参的时候自动调用了apply方法返回了param1 and param2到了myApply。

class ClassAndObjectApplyTest{ //伴生类和对象apply方法的结合使用
}
class ApplyTest{
def apply()={
println("apply method in class is called.");
}
def greetingFromClass = println("Greet method is called.");
//没有参数的时候可以省略圆括号
}
object ApplyTest{
def apply() = {
println("apply method in object is called.");
new ApplyTest;//返回一个ApplyTest类型的实例
}
}
object ClassAndObjectApplyTest{
def main(args:Array[String]): Unit ={
val myApply = ApplyTest();//ApplyTest伴生对象的调用,这里的括号一定不能省略
//注意,我们这里没有new关键字,是对ApplyTest的伴生对象的调用
//伴生对象会自动调用伴生对象的apply方法
myApply.greetingFromClass;
myApply();
//ApplyTest伴生类的调用
//然后自动调用了伴生类的apply方法
}
}
输出结果 apply method in object is called. Greet method is called. apply method in class is called.

我们这个例子包含了两对的伴生类和对象。

因为我们这里并没有任何参数,所以我们这里使用()就是向其传入参数。

我们在调用ApplyTest伴生对象并传参的时候,自动调用了ApplyTest伴生对象的apply方法,返回一个ApplyTest伴生类的一个实例对象。

我们可以通过ApplyTest伴生类的对象访问类中的方法,虽然被实例化了但是并没有传递参数,所以并没有调用其apply方法。

当我们执行myApply()的时候是对ApplyTest伴生类传参的操作,因为没有参数,所以只加了圆括号,然后自动调用其apply方法。

下面看一个scala语法中的apply的例子

val myStrArr = Array("BigDate","Hadoop","Spark");

注意到,我们在定义数组的时候,并没有像Java那样需要使用new关键字创建,

没有new实例,并不能用构造器创建,而且还直接传递了三个参数,怎么创建的呢?

其实这里,scala就会自动转换成对Array的伴生对象apply方法的调用,完成数组的建立和初始化。

update

update方法的约定:当对带有圆括号并包括一到若干参数的对象进行赋值时,编译器将调用对象的update方法。

在调用时,是把括号里的参数和等号右边的对象一起作为方法的输入参数来执行调用。

示例

val myStrArr = new Array[String](3);//声明一个长度为3的字符串数组
myStrArr(0) = "BigDate";//这里正好符合了update方法的调用规则
//调用了伴生类的Array的update方法
            //执行了myStrArr.update(0,"BigDate")

从上个例子可以看出,在进行数组赋值的时候,之所以没有向java一样采用了myStrArr[0]这样的赋值的方式,

而是采用了update方法的赋值机制,为了能触发update方法的机制,所以才使用myStrArr(0)这样圆括号的形式进行赋值。

【scala】apply和update的更多相关文章

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

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

  2. (转)scala apply方法 笔记

    在akka源码中有这样一个Cluster类. 使用方法是这样的:val cluster = Cluster(context.system); 作为scala菜鸟的我,并没有找到Cluster(syst ...

  3. Scala Apply

    class ApplyTest{ //一定要写(),不加括号就报错. def apply() = println("Into Spark!") def havaAtry(){ pr ...

  4. 抹掉Scala的糖衣(14) -- Update Method

    欢迎关注我的新博客地址:http://cuipengfei.me/ 在Scala中,名字叫做update的方法是有特殊作用的. 比如: 1 2 3 val scores = new scala.col ...

  5. Scala 具体的并行集合库【翻译】

    原文地址 本文内容 并行数组(Parallel Array) 并行向量(Parallel Vector) 并行范围(Parallel Range) 并行哈希表(Parallel Hash Tables ...

  6. scala学习笔记——操作符

    中置操作符(二元操作符),操作符位于两个参数之间.操作符包括字母,比如to,也可以包括操作符字符,比如1->10,等同于方法调用1.->(10) a 标识符 b 其中的标识符是一个带有两个 ...

  7. Scala入门指南与建议

    最近在学习使用Scala语言做项目,感觉这门语言实在是太优美了!作为一个本科数学.研究生机器学习专业的混合人才(哈哈),这门语言真的是满足了普通计算机编程(告诉计算机怎么做)和函数式编程(告诉计算机做 ...

  8. scala流程控制语句以及方法和函数

    1.if else表达式 scala中没有三目运算符,因为根本不需要.scala中if else表达式是有返回值的,如果if或者else返回的类型不一样,就返回Any类型(所有类型的公共超类型). 例 ...

  9. scala学习手记37 - 容器的使用

    这次统一看一下scala中容器类的几个方法. Set filter()方法 filter()方法用来从Set中过滤获取含有指定特征的元素.示例代码如下: val colors1 = Set(" ...

随机推荐

  1. lamp中的Oracle数据库链接

    lamp一键安装包: https://lnmp.org/install.html 在CentOS 6.7 64位安装PHP的PDO_OCI扩展 Installing PDO_OCI extension ...

  2. Django:学习笔记(4)——请求与响应

    Django:学习笔记(4)——请求与响应 0.URL路由基础 Web应用中,用户通过不同URL链接访问我们提供的服务,其中首先经过的是一个URL调度器,它类似于SpringBoot中的前端控制器. ...

  3. CNN学习笔记:全连接层

    CNN学习笔记:全连接层 全连接层 全连接层在整个网络卷积神经网络中起到“分类器”的作用.如果说卷积层.池化层和激活函数等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的特征表示映射到样 ...

  4. LeetCode:课程表【207】

    LeetCode:课程表[207] 题目描述 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹 ...

  5. cart_购物车小程序

    #author:leon product_list= [ ('iphone',5800), ('mac pro',9800), ('bike',800), ('watch',6000), ('coff ...

  6. java zookeeper权限控制ACL(digest,IP)

    java zookeeper权限控制ACL(auth,digest,ip) 学习前请参考:https://www.cnblogs.com/zwcry/p/10407806.html zookeeper ...

  7. 防止CSRF的攻击—Origin和Referer

    防止CSRF的攻击—Origin和Referer 为了防止CSRF的攻击,我们建议修改浏览器在发送POST请求的时候加上一个Origin字段,这个Origin字段主要是用来标识出最初请求是从哪里发起的 ...

  8. 20145222黄亚奇《网络对抗》MSF基础应用

    实践目标 掌握metasploit的基本应用方式. 具体需要完成(1)ms08_067;(2)ms11_050:(3)Adobe(4)成功应用任何一个辅助模块. 实验内容 掌握metasploit的基 ...

  9. spark SQL学习(load和save操作)

    load操作:主要用于加载数据,创建出DataFrame save操作:主要用于将DataFrame中的数据保存到文件中 代码示例(默认为parquet数据源类型) package wujiadong ...

  10. VMware Workstation 12 增加磁盘容量 Windows Server 2012 系统

    1.安装虚拟机后,检查C盘容量大小,发现C盘现在的空间是59.9GB,如下图: 2.使用window+R键,出现运行窗口,输入‘cmd’——>‘cd C:\Program Files (x86) ...