4.2. 函数也是对象(Functions are Objects)
既然方法是值,值是对象,方法当然也就是对象。实际上,函数类型和函数值(注意:指函数本身作为值——译注)只不过是相应的类及其实例的语法糖衣。函数类型S=>T等价于参数化类型scala.Function1[S, T],这个类型定义在Scala标准类库中:
package scala
abstract class Function1[-S,+T] {
def apply(x: S): T
}
参数超过一个的函数也可类似地定义,一般而言,n-元函数类型:(T1,T2,…,Tn)=>T被解释为Functionn[T1,T2,…,Tn,T]。也就是说,函数就是拥有apply方法的对象。例如,匿名函数“+1”:x:int=>x+1,就是如下函数Function1的实例:
new Function1[int, int] {
def apply(x: int): int = x + 1
}
反之,当一个函数类型的值被应用于参数之上(也就是调用——译注)时,这个类型的apply方法被自动插入,例如:对于Function1[S, T]类型的函数p,p(x)调用自然扩展为p.apply(x)。
4.3. 细化函数(Refining Functions)
既然Scala中函数类型是类,那么也可以再细化成为子类。以Array为例,这是一种以整数为定义域的特殊函数。Array[T]继承自Function1[int, T],并添加了数组更新、长度等方法:
package scala
class Array[T] extends Function1[int, T]
with Seq[T] {
def apply(index: int): T = ...
def update(index: int, elem: T): unit= ...
def length: int = ...
def exists(p: T => boolean): boolean = ...
def forall(p: T => boolean): boolean = ...
...
}
赋值语句左侧的函数调用是存在特殊语法的,他们使用update方法。例如,a(i)=a(i)+1被翻译成:
a.update(i, a.apply(i) + 1)
将Array存取翻译成方法调用看上去代价比较高,但是Scala中的inlining变换可以将类似于上面的代码翻译成宿主系统的原生数组存取。
上述Array类型还定义了exists和forall方法,这样也就不必手工定义了,使用这些方法,hasZeroRow可以如下定义:
def hasZeroRow(matrix: Array[Array[int]]) =
matrix exists (row => row forall (0 ==))
注意上述代码和相关操作的语言描述的对应性:“test whether in the matrix there exists a row such that in the row all elements are zeroes”(检测一个矩阵,看看它是否有一行的所有元素都等于0。这里保留英语原文,因为原文中使用斜体部分对应于上述代码的内容,体现两种语法的对应关系——译注)。还要注意一点:在上面的匿名方法中,我们略去了参数row的类型,因为其类型可以被Scala编译器根据matrix.exists方法推断出来。
分享到:
相关推荐
#### 二、Scala概述 ##### 2.1 什么是Scala Scala是一种多范式编程语言,它结合了面向对象编程与函数式编程的特点。Scala语言的设计目标之一就是尽可能地提高代码的可读性和简洁性,同时保持高性能。由于Scala运行...
- **列表操作**:对`List`的所有操作都会返回一个新的`List`对象,不会修改原有列表。 - 例如,可以使用`++`或`:::`运算符来合并列表。 - **列表切片**:使用`slice`方法可以从列表中提取子列表。 ##### 可变序列 ...
- **函数式编程**:同时,Scala也支持函数式编程范式,包括高阶函数、不可变数据结构等。 - **兼容性**:Scala可以在Java平台上运行,可以调用Java库,并且与Java代码无缝交互。 - **简洁性**:Scala通过减少冗余...
2. 面向对象编程与函数式编程的结合:Scala允许开发者同时利用面向对象和函数式编程的优势。类、对象和接口是面向对象的基础,而高阶函数、不可变数据结构和模式匹配则是函数式编程的核心。这使得Scala在处理复杂...
- **面向对象**:Scala是纯粹的面向对象语言,每一个值都是对象,所有的操作都是方法调用。 - **函数式编程**:Scala同时也是一个成熟的函数式编程语言,支持高阶函数、模式匹配等功能。 - **类型推断**:Scala具有...
Scala概述.pptx 变量.pptx 运算符.pptx 程序流程控制.pptx 函数式编程基础.pptx 面向对象编程(基础部分).pptx 面向对象编程(中级部分).pptx 面向对象编程(高级特性).pptx 隐式转换和隐式参数.pptx 集合(上)-基本使用...
#### Scala概述 Scala是一种相对新兴的编程语言,旨在为Java虚拟机(JVM)以及后来的通用语言运行时(CLR)提供支持。它融合了函数式编程(Functional Programming, FP)与面向对象编程(Object-Oriented Programming, OOP...
本教程将探讨如何使用 Scala 语言来操作 Spark,并介绍如何与 MySQL 数据库和 HDFS(Hadoop 分布式文件系统)进行交互。以下是相关知识点的详细说明: **1. Scala 语言基础** Scala 是一种多范式编程语言,融合了...
Scala是一种多范式编程语言,它融合了面向对象和函数式编程的概念,旨在提供一种简洁、类型安全且高性能的编程体验。在这个电子书集合中,我们有三本关于Scala的重要书籍,分别是"Scala Tutorial"、"Programming in ...
#### 一、Scala语言概述 **Scala**是一种强大的多范式编程语言,它将面向对象编程和函数式编程的最佳特性融合在一起。作为一种类Java的语言,Scala旨在提供比Java更简洁、更灵活且功能更丰富的编程体验。 - **面向...
- **第3章:Scala中的面向对象编程** - **内容要点**:探讨Scala如何实现面向对象编程特性,并与Java等语言进行比较。 - **目标读者**:熟悉面向对象编程的开发者。 - **第4章:用函数式数据结构娱乐** - **...
根据提供的文件信息,本书《Learning Scala》是一本旨在为读者提供Scala语言深入理解与实践操作的指南。Scala是一种结合了面向对象编程与函数式编程特性的强大语言,它运行在Java虚拟机(JVM)上,具有强大的类型...
3. **面向对象编程**:Scala中的类可以有构造函数、方法、属性,同时支持单例对象和多重继承(通过特质实现)。它引入了“case class”来简化模式匹配,并且提供了隐式转换以增强类型兼容性。 4. **Actor模型**:...
**Scala概述**: - **定义**:Scala是一种功能强大的编程语言,旨在集成面向对象编程和函数式编程的特点。它运行在Java平台上,并且与Java高度兼容。 - **为何选择Scala**: - **优雅性**:良好的API设计可以极大...