`
1025250620
  • 浏览: 230470 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Scala 中apply方法的用法~(转)

 
阅读更多

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,被称为抽取方法,因为它可以传入相同子集的元素并抽取其中的部分,这是后话。

分享到:
评论

相关推荐

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

    在Scala中,`apply`方法通常被用作工厂方法,使得我们可以像调用函数一样创建类的实例。当我们有一个伴生对象并定义了`apply`方法,我们就可以通过类名直接调用这个方法,而无需使用`new`关键字。 以下是一个简单的...

    Scala的List类方法整合

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

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

    这篇文章将深入探讨`Class`、`Object`以及`Apply()`方法在Scala中的使用。 首先,`Class`在Scala中用于定义类,它允许我们创建具有特定属性和行为的对象。类是抽象的,它们描述了实例化后的对象的结构和功能。例如...

    Scala考试题1

    - `unapply` 用于模式匹配,常在自定义的类型提取器中使用,如 `Some.apply()` 和 `Some.unapply()`。 6. **伴生对象和伴生类**: - 伴生对象与伴生类位于同一个源文件中,它们可以访问对方的私有成员。对象和类...

    Scala里的数组方法

    下面将详细介绍Scala中的一些关键数组方法及其用法。 #### 1. `def apply(x:T, xs:T*):Array[T]` 此方法用于创建一个包含给定元素的数组。第一个参数`x`是数组中的首个元素,而`xs`则表示剩余的元素,它们可以是...

    Scala基础与实践

    6. apply方法:Scala中的apply方法使得实例化一个对象变得更加简洁。当一个单例对象(object)有一个apply方法时,可以使用类名直接创建实例,而不需要显式调用new关键字。 7. 包:Scala支持包的嵌套和包对象的概念...

    scala教材.docx

    在 Scala 教程中,我们首先会接触到基础概念,包括表达式、值、函数、类、继承、特质、类型、apply 方法、单例对象、函数即对象、包、模式匹配、样本类以及异常处理机制 try-catch-finally。 1. **表达式**:Scala ...

    beginners-guide-to-scala

    在Scala中,样例类(case class)是一个特殊类型的类,它配合伴生对象(companion object)使用。伴生对象中包含了apply和unapply两个重要方法。apply方法允许开发者直接通过类名来创建样例类的实例,而unapply方法...

    Scala和设计模式.pdf

    在Scala中,工厂模式可以通过伴生对象(companion object)和应用方法(apply method)来实现: ```scala object Car { def apply(carType: String): Car = carType match { case "Race" => RaceCar() case ...

    Scala学习笔记

    - **Scala中的相等性**: 在Scala中,使用 `==` 来比较两个对象的值相等性,而 `eq` 和 `ne` 方法用于比较对象引用是否相同。 #### 8. Scala源文件的命名规范 - **文件命名**: 通常按照所包含的类名来命名文件,这...

    scala for the impatient

    6. apply方法:Scala中的apply方法是一个特殊的函数,它允许开发者以一种特殊的方式调用对象。这使得创建轻量级的实例更加方便和直观。 7. Scaladoc:Scaladoc是Scala的文档工具,它可以生成API文档,就像Java中的...

    Scala设计模式

    - **标准且简洁:** 使用`apply`方法作为工厂方法,使得语法更加简洁。 - **类似于构造器调用:** 通过`apply`方法调用的方式,类似于构造器调用,易于理解。 **劣势:** - **仅限于静态工厂方法:** Scala中无法像...

    spark开发基础之Scala快餐.pdf

    例如,关键字apply在Scala中可以用于调用一个伴生对象中的同名方法,此方法用于创建或操作伴生类的实例。 Scala的另一个重要特性是模式匹配(pattern matching),这是一个强大的工具,允许程序分支处理不同数据...

    【zk开发】use和apply的区别

    在Scala这样的语言中,`apply`方法是定义在`case class`和`object`上的特殊方法,使得你可以像调用函数一样实例化一个类。例如: ```scala case class Person(name: String, age: Int) val person = Person("Alice...

    Scala常用List列表操作方法示例

    在Scala中,可以使用多种方式创建列表,例如使用`List`对象的构造函数、使用 `::` 操作符、使用 `List` 对象的 `apply` 方法等。 * 使用`List`对象的构造函数创建列表:`val days = List("Sunday", "Monday", ...

    Scala编程语言详解(从入门到精通)spark

    - **`apply` 和 `update` 方法**:`apply` 方法通常用于实例化对象或调用构造函数,而 `update` 方法用于更新现有的数据结构。 - **Option 类型**:Scala 使用 `Option` 类型来处理可能为空的情况,避免了空指针异常...

    scala从入门到精通技术教学视频

    15.apply()方法 16.案例_定义工具类 第七章 继承 00.导学 01.继承入门 02.单例对象的继承 03.方法重写 04.isInstanceOf和asInstanceOf 05.getClass和ClassOf关键字 06.抽象类入门 07.抽象字段 08.匿名...

    Scala编程详解 第13讲-Scala编程详解:面向对象编程之对象 共9页.pptx

    Scala是一种强大的多范式编程语言,它...以上就是Scala面向对象编程中的`object`、伴生对、`apply`方法以及`main`方法的基本概念和用法。这些是Scala编程中的核心组成部分,对于理解和使用Scala进行实际开发至关重要。

    快学Scala 课后习题答案集合-中文版

    在Scala中,注解是一种元数据,可以附加到类、方法、变量等程序元素上,以提供额外的信息。这些信息可以用于编译时检查、运行时行为修改或代码生成等目的。Scala提供了两种类型的注解:单行注解和多行注解。例如,`@...

Global site tag (gtag.js) - Google Analytics