Scala语言 中的 apply 和 update 方法的使用
2014-10-16 12:19
435 查看
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 的取值操作,的确如此。我们可以作个例子:
[plain]
view plaincopyprint?
classSomeClass {
defapply(key:String):String ={
println("apply method called, key is: " + key)
"Hello World!"
}
}
valanyObject =new SomeClass
println(anyObject("key1"))
执行后输出结果是:
apply method called, key is: key1
Hello World!
说明是调用到了相应的 apply 方法的。
3. 我们在构造 Array 或 Map 时,会简单的写成
[plain]
view plaincopyprint?
valnumNames =Array("zero","one","two")
这里也是调用的 apply 方法,我们看起来好像是作用在类 Array 上的,其实不然,而是作用在 Array 的伴生对象(object Array)上的,调用的是伴生对象 Array 的 apply 方法,即:
[plain]
view plaincopyprint?
valnumNames =Array.apply("zero","one","two")
上面的功效像是调用的 Array 类的 apply 工厂方法。同样看个单例对象的例子,也解释了伴生对象的 apply 方法的调用
[plain]
view plaincopyprint?
objectEMail {
defapply(user:String, domain:String):String ={
println("apply method called")
user + "@"+ domain
}
}
valemail =EMail("lyrebing","hotmail.com")
println(email)
上面代码执行后输出结果是:
apply method called
lyrebing@hotmail.com
有了前面 apply 方法的理解,下面对 update 方法的理解就很顺畅了,比如:
[plain]
view plaincopyprint?
greetStrings(0)="Hello"
会转换成调用
[plain]
view plaincopyprint?
greetStrings.update(0,"Hello")
来个复杂的 Demo,赋值时等号左边带两个参数,并且赋值操作会产生返回值的情况(纯粹用于演示)
[plain]
view plaincopyprint?
classSomeClass {
defupdate(arg1:Int, arg2:String, arg3:String):String ={
println("update method called")
arg1+ "|"+ arg2+ "|"+ arg3
}
}
valobj =new SomeClass
valresult =(obj(1,"key1")="Hello")
println(result)
执行后输出结果为:
update method called
1|key1|Hello
在应用 apply 和 update 规则时,关键是转换后的调用要找到相应的方法原型。再就是应用 update 时,等号右边的值会作为 update 方法的最后一个参数
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 的取值操作,的确如此。我们可以作个例子:
[plain]
view plaincopyprint?
classSomeClass {
defapply(key:String):String ={
println("apply method called, key is: " + key)
"Hello World!"
}
}
valanyObject =new SomeClass
println(anyObject("key1"))
classSomeClass { defapply(key:String):String ={ println("apply method called, key is: " + key) "Hello World!" } } valanyObject =new SomeClass println(anyObject("key1"))
执行后输出结果是:
apply method called, key is: key1
Hello World!
说明是调用到了相应的 apply 方法的。
3. 我们在构造 Array 或 Map 时,会简单的写成
[plain]
view plaincopyprint?
valnumNames =Array("zero","one","two")
valnumNames =Array("zero","one","two")
这里也是调用的 apply 方法,我们看起来好像是作用在类 Array 上的,其实不然,而是作用在 Array 的伴生对象(object Array)上的,调用的是伴生对象 Array 的 apply 方法,即:
[plain]
view plaincopyprint?
valnumNames =Array.apply("zero","one","two")
valnumNames =Array.apply("zero","one","two")
上面的功效像是调用的 Array 类的 apply 工厂方法。同样看个单例对象的例子,也解释了伴生对象的 apply 方法的调用
[plain]
view plaincopyprint?
objectEMail {
defapply(user:String, domain:String):String ={
println("apply method called")
user + "@"+ domain
}
}
valemail =EMail("lyrebing","hotmail.com")
println(email)
objectEMail { defapply(user:String, domain:String):String ={ println("apply method called") user + "@"+ domain } } valemail =EMail("lyrebing","hotmail.com") println(email)
上面代码执行后输出结果是:
apply method called
lyrebing@hotmail.com
有了前面 apply 方法的理解,下面对 update 方法的理解就很顺畅了,比如:
[plain]
view plaincopyprint?
greetStrings(0)="Hello"
greetStrings(0)="Hello"
会转换成调用
[plain]
view plaincopyprint?
greetStrings.update(0,"Hello")
greetStrings.update(0,"Hello")
来个复杂的 Demo,赋值时等号左边带两个参数,并且赋值操作会产生返回值的情况(纯粹用于演示)
[plain]
view plaincopyprint?
classSomeClass {
defupdate(arg1:Int, arg2:String, arg3:String):String ={
println("update method called")
arg1+ "|"+ arg2+ "|"+ arg3
}
}
valobj =new SomeClass
valresult =(obj(1,"key1")="Hello")
println(result)
classSomeClass { defupdate(arg1:Int, arg2:String, arg3:String):String ={ println("update method called") arg1+ "|"+ arg2+ "|"+ arg3 } } valobj =new SomeClass valresult =(obj(1,"key1")="Hello") println(result)
执行后输出结果为:
update method called
1|key1|Hello
在应用 apply 和 update 规则时,关键是转换后的调用要找到相应的方法原型。再就是应用 update 时,等号右边的值会作为 update 方法的最后一个参数
相关文章推荐
- Scala 中的 apply 和 update 方法
- scala 的apply,update,unapply方法
- Scala 中的 apply 和 update 方法
- scala中的apply和update方法
- scala入门-08 apply方法和单例对象的使用
- scala的 apply方法和update方法
- Scala apply() unapply() update() 方法
- scala入门-08 apply方法和单例对象的使用
- Scala 中的 apply 和 update 方法[转]
- Scala 中的 apply 和 update 方法
- javascript中apply使用方法小议
- 在UpdatePanel使用脚本的方法(AJAX)
- javascript中apply使用方法小议
- Ajax(5)UpdatePanel的使用方法
- js中apply使用方法小议。
- 学语言最好的方法是尽量多地联系使用它。(The way to learn a language is to practice using it as often as possible.)
- asp:UpdatePanel 中 GridView 使用 LinkButton 选择无反应 解决方法
- [导入]使用Sharepoint的Lists Web Service调用UpdateListItems方法"增/删/改"List Items
- [导入]weblogic81下使用hibernate3的update query方法应注意的问题
- AJAX中关于多个UpdatePanel 的 UpdateProgress 的使用方法