`
wbj0110
  • 浏览: 1603128 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Scala 的 apply 和 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 的取值操作,的确如此。我们可以作个例子:

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(arg1: Int, arg2: String, arg3: String): String = {
        println("update method called")
        arg1 + "|" + arg2 + "|" + arg3
    }
}
 
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的List类方法整合

    本文将详细介绍 `List` 类中的多种方法及其用途,帮助开发者更好地理解和使用这些功能。 #### 1. `def + (elem: A): List[A]` 此方法用于向列表的末尾添加一个元素,并返回一个新的列表。 **示例代码:** ```scala ...

    浅谈Scala的Class、Object和Apply()方法

    在Scala编程语言中,`Class`和`Object`扮演着重要的角色,它们是构建程序的基础。Scala的面向对象特性使得这两个概念与Java等其他语言有所...理解并熟练使用`Class`、`Object`和`Apply()`方法是掌握Scala编程的关键。

    Scala+maven安装方法.docx

    为了方便开发者快速搭建 Scala 环境,本文将介绍 Scala+maven 的安装方法,并对 Scala IDE 的下载和配置进行详细的讲解。 一、下载 Scala IDE Scala IDE 是一个基于 Eclipse 平台的集成开发环境,提供了许多功能...

    响应式架构 消息模式Actor实现与Scala.Akka应用集成

    Akka框架就是用Scala编写的,因此,使用Scala来编写Akka应用程序可以充分利用语言的强大特性和表达能力,如类型安全、模式匹配和高阶函数等。 在"响应式架构 消息模式Actor实现与Scala.Akka应用集成"这个主题中,...

    Scala安装包和kafka安装包

    Scala是一种强大的、面向对象的编程语言,它集成了函数式编程的特点,被广泛应用于大数据处理和分布式计算领域。Kafka是Apache基金会开发的一款开源流处理平台,它最初由LinkedIn设计并贡献,现在已经成为大数据生态...

    mongo-scala-drive的使用demo

    MongoDB 是一个流行的开源文档型数据库,而 Scala 是一种强大的函数式编程语言。...通过深入研究 `mongo-scala-driver` 文档和实践,你可以更好地理解如何利用其功能来构建高效、可扩展的 MongoDB 应用程序。

    Scala考试题1

    5. **unapply 和 apply 方法的区别**: - `apply` 方法用于创建对象或者调用对象的方法,如 `List.apply()` 创建列表。 - `unapply` 用于模式匹配,常在自定义的类型提取器中使用,如 `Some.apply()` 和 `Some....

    Scala—— 9.伴生对象apply方法

    总结来说,Scala中的伴生对象和`apply`方法结合,提供了一种方便的、函数式的创建对象的方式。通过在伴生对象中定义`apply`方法,我们可以使类的实例化更加灵活,同时保持代码的简洁性。这对于构建模块化的、可扩展...

    scala sdk scala-2.12.3

    通过学习和使用Scala SDK,开发者可以利用其丰富的语言特性来构建复杂的软件系统,尤其是在大数据处理、Web应用、云计算等领域,Scala已经展现出了强大的生命力。例如Apache Spark,一个流行的分布式计算框架,就是...

    Scala和Spark大数据分析函数式编程、数据流和机器学习

    Scala和Spark是大数据分析领域中的两个重要工具,它们在处理大规模数据时表现出强大的性能和灵活性。Scala是一种静态类型的函数式编程语言,而Spark是一个分布式计算框架,尤其适合于大数据处理和分析。本教程将深入...

    scala + mybatis 数据库查询

    - Scala的静态类型系统和强大的表达能力使其成为构建复杂应用程序的良好选择,而MyBatis以其灵活性和易用性在Java世界中占有一席之地。通过使用Scala的Java互操作性,我们可以无缝地在Scala中使用MyBatis。 - 集成...

    面向Java开发人员Scala指南,Scala和servlet的比较

    例如,Java中的servlet需要重写多个方法如`doGet`和`doPost`,而在Scala中,可以通过高阶函数和模式匹配来简化这些操作。 其次,Scala支持函数式编程。这使得代码更易于测试和维护,因为函数式编程强调无副作用和纯...

    windows 10 系统Scala和sbt环境配置教程方法.docx

    Windows 10 系统 Scala 和 SBT 环境配置教程方法 摘要:本文档提供了在 Windows 10 系统上配置 Scala 和 SBT 环境的详细教程,涵盖了 Scala 和 SBT 的安装、配置和测试等步骤。 一、 Scala 安装和配置 Scala 是一...

    Scala语法简明教程

    - **分布式运行**:Scala设计之初就考虑到了并行和分布式计算的需求,能够很好地支持大规模数据处理和分布式应用程序开发。 - **与Java和C#无缝集成**:Scala能够在JVM上运行,因此可以直接访问Java库,与Java程序...

    scala3 scala3 scala3 scala3 scala3

    Scala3,也被称为Scala 3或Dotty,是Scala编程语言的一个重大更新,旨在提高其简洁性、可读性和类型安全性。Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对...

    scala详细总结

    3. 广泛应用:Scala 语言可以用于开发Web应用程序、移动应用程序、桌面应用程序等。 Scala 语言的应用场景: 1. Web 开发:Scala 语言可以用于开发Web应用程序,例如使用 Play Framework 开发Web应用程序。 2. ...

    scala实战高清讲解

    - 集合API:Scala的集合库强大且高效,包含各种数据结构如List、Set、Map和ArrayBuffer,提供了丰富的操作方法。 - 并行集合:并行集合可以在多核处理器上并行执行操作,提升计算性能。 6. **模式匹配** - 枚举...

    Scala在挖财的应用实践-infoq.zip

    Scala,一种多范式编程语言,融合了面向对象和函数式编程的概念,因其强大的表达性和高性能,近年来在金融科技领域,尤其是大数据处理和分布式计算中得到了广泛应用。挖财,作为国内知名的金融科技公司,利用Scala的...

    scalaenv, 对应用程序的Scala 环境.zip

    scalaenv, 对应用程序的Scala 环境 scalaenv 使用scalaenv像 rbenv 一样,对你的应用程序环境进行 Scala: )是否需要 sbt版本管理?请参考英镑 sbtenv 。安装基本的GitHub结帐git clone scalaenv到 ~

Global site tag (gtag.js) - Google Analytics