Scala中apply方法的用法-创新互联

Scala 是构建在 JVM 上的静态类型的脚本语言,而脚本语言总是会有些约定来增强灵活性。关于协议在Python中是挺多的,看看Python的对象协议,有很多很多,如果对Python的对象协议了解(不了解的可以点击此处)的比较深刻的话,其实scala的apply方法也是很好理解的,比如说 Scala 为配合 DSL 在方法调用时有这么一条约定:

创新互联建站专注于企业营销型网站、网站重做改版、陇县网站定制设计、自适应品牌网站建设、H5高端网站建设商城网站定制开发、集团公司官网建设、外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为陇县等各大城市提供网站开发制作服务。

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

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

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

我感觉这一点有点像Python里的可调用对象协议,即定义类的__call__方法,也可以得到类似的功能。

当然,两者语言语法上肯定有差异,但是我觉得这块儿它们的设计思想应该是异曲同工.下面通过几个例子来理解.

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

2. anyObject("key1") 会被转换成 anyObject.apply("key") 操作,比如 Map 的取值操作,举个简单的例子:

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 时,会简单的写成

val numNames = Array("zero", "one", "two")

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

val numNames = Array.apply("zero", "one", "two")

同样看个单例对象的例子,也解释了伴生对象的 apply 方法的调用

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

object apply 是一种比较普遍用法。 主要用来解决复杂对象的初始化问题,同时也是单例.

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章题目:Scala中apply方法的用法-创新互联
标题网址:http://bzwzjz.com/article/dodioh.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 梓潼网站设计 成都网站建设 企业网站建设 成都网站制作 成都网站建设 成都网站建设 手机网站建设 自适应网站建设 网站制作 成都网站设计 成都网站建设 成都网站建设 app网站建设 成都网站制作 网站建设方案 广安网站设计 企业网站设计 成都网站制作 成都品牌网站设计 成都网站设计公司 定制网站建设多少钱 网站建设改版