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
2
3
4
5
6
7
8
9
|
class SomeClass {
def apply(key : String) : String = {
println( "apply method called, key is: " + key)
"Hello World!"
}
} val anyObject = new SomeClass
println(anyObject( "key1" ))
|
执行后输出结果是:
apply method called, key is: key1
Hello World!
说明是调用到了相应的 apply 方法的。
3. 我们在构造 Array 或 Map 时,会简单的写成
1
|
val numNames = Array( "zero" , "one" , "two" )
|
这里也是调用的 apply 方法,我们看起来好像是作用在类 Array 上的,其实不然,而是作用在 Array 的伴生对象(object Array)上的,调用的是伴生对象 Array 的 apply 方法,即:
1
|
val numNames = Array.apply( "zero" , "one" , "two" )
|
上面的功效像是调用的 Array 类的 apply 工厂方法。同样看个单例对象的例子,也解释了伴生对象的 apply 方法的调用
1
2
3
4
5
6
7
8
9
|
object EMail {
def apply(user : String, domain : String) : String = {
println( "apply method called" )
user + "@" + domain
}
} val email = EMail( "fantasia" , "sina.com" )
println(email) |
上面代码执行后输出结果是:
apply method called
fantasia@sina.com
有了前面 apply 方法的理解,下面对 update 方法的理解就很顺畅了,比如:
1
|
greetStrings( 0 ) = "Hello"
|
会转换成调用
1
|
greetStrings.update( 0 , "Hello" )
|
来个复杂的 Demo,赋值时等号左边带两个参数,并且赋值操作会产生返回值的情况(纯粹用于演示)
01
02
03
04
05
06
07
08
09
10
|
class SomeClass {
def update(arg 1 : Int, arg 2 : String, arg 3 : String) : String = {
println( "update method called" )
arg 1 + "|" + arg 2 + "|" + arg 3
}
} val obj = new SomeClass
val result = (obj( 1 , "key1" ) = "Hello" )
println(result) |
执行后输出结果为:
update method called
1|key1|Hello
在应用 apply 和 update 规则时,关键是转换后的调用要找到相应的方法原型。再就是应用 update 时,等号右边的值会作为 update 方法的最后一个参数。
因为这样的行为,apply 方法又被称为注入方法,因为它可以传入一些参数并生成指定子集的元素。在以后的学习中会遇到它对偶的方法 unapply,被称为抽取方法,因为它可以传入相同子集的元素并抽取其中的部分
http://unmi.cc/scala-apply-update-methods/
相关推荐
包含Scala语言关于Map的相关方法总结,包括详尽的方法名及其作用
详细总结Scala语言的List类封装的相关方法,具有详细的方法名及解析
下面小编就为大家带来一篇浅谈Scala的Class、Object和Apply()方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Scala+maven安装方法,及scala环境搭建,Scala IDE下载及配置
响应式架构 消息模式Actor实现与Scala.Akka应用集成 响应式架构 消息模式Actor实现与Scala.Akka应用集成
Scala语言关于数组方法的整合,包括详细的各个函数名及作用
Scala以及kafka的安装包,Linux下的安装包,Scala2.11.4和kafka的2.92
scalaenv, 对应用程序的Scala 环境 scalaenv 使用scalaenv像 rbenv 一样,对你的应用程序环境进行 Scala: )是否需要 sbt版本管理?请参考英镑 sbtenv 。安装基本的GitHub结帐git clone scalaenv到 ~
Scala语言的字符串类型封装的方法总结。具有大多数的String字符串方法名及其描述
org.scala-ide.sdt.update-site.zip org.scala-ide.sdt.update-site.zip org.scala-ide.sdt.update-site.zip
Scala和Spark大数据分析函数式编程、数据流和机器学习
在伴生对象中定义apply方法,可以实现:类名(参数)方式来创建对象实例 object boke_demo01 { def main(args: Array[String]): Unit = { val list = List(1, 2, 5) println(list) val pig = new Pig(狗蛋) //...
Akka是JAVA虚拟机JVM平台上构建高并发、分布式和容错应用的工具包和运行时。Akka用Scala语言写成,同时提供了Scala和JAVA的开发接口。
Scala在挖财的应用实践-infoq.pdf
消息模式Actor实现与Scala、Akka应用集成
Scala在挖财的应用实践-infoq
“本书向你展示了提升Scala技能的方法和理念,它已超过‘更好的Java’。” ——Fernando Dobladez, Code54 “里面的练习有些挑战,很有趣,对你在真实世界中使用它很有益。” ——Chris Nauroth, ...
scala编程 33章 中文pdf Scala编程实战 目录 第1章字符串. 11 第2章数值39 第3章控制结构.60 第4章类和属性.103 第5章方法147 第6章对象170 第7章包和导入.190 第8章特质200 第9章函数式编程214 第10 章集合242 第...
scalajs-vue, Vue.js的Scala.js 绑定和示例应用程序 scalajs-vue用于 Vue.js的Scala.js-绑定和示例应用程序要作为图书馆使用,只要从https://jitpack.io/#fancellu/scalajs-vue 示例应用展示了使用 Scala.j
scala-2.12.3 scala-2.12.3 scala-2.12.3 scala-2.12.3