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

Scala概述(四)操作也是对象(2、3)

阅读更多

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-元函数类型:T1T2Tn=>T被解释为Functionn[T1T2TnT]。也就是说,函数就是拥有apply方法的对象。例如,匿名函数“+1:x:int=>x+1,就是如下函数Function1的实例:

new Function1[int, int] {

def apply(x: int): int = x + 1

}

反之,当一个函数类型的值被应用于参数之上(也就是调用——译注)时,这个类型的apply方法被自动插入,例如:对于Function1[S, T]类型的函数pp(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类型还定义了existsforall方法,这样也就不必手工定义了,使用这些方法,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方法推断出来。

 

 

 

分享到:
评论
1 楼 徐风子 2009-07-21  
难,太难了,跌跌撞撞的看到这儿,回去重新复习做笔记吧。

相关推荐

    scala的操作笔记

    #### 二、Scala概述 ##### 2.1 什么是Scala Scala是一种多范式编程语言,它结合了面向对象编程与函数式编程的特点。Scala语言的设计目标之一就是尽可能地提高代码的可读性和简洁性,同时保持高性能。由于Scala运行...

    Scala-part2集合框架

    - **列表操作**:对`List`的所有操作都会返回一个新的`List`对象,不会修改原有列表。 - 例如,可以使用`++`或`:::`运算符来合并列表。 - **列表切片**:使用`slice`方法可以从列表中提取子列表。 ##### 可变序列 ...

    scala 教程

    - **函数式编程**:同时,Scala也支持函数式编程范式,包括高阶函数、不可变数据结构等。 - **兼容性**:Scala可以在Java平台上运行,可以调用Java库,并且与Java代码无缝交互。 - **简洁性**:Scala通过减少冗余...

    Scala Overview

    2. 面向对象编程与函数式编程的结合:Scala允许开发者同时利用面向对象和函数式编程的优势。类、对象和接口是面向对象的基础,而高阶函数、不可变数据结构和模式匹配则是函数式编程的核心。这使得Scala在处理复杂...

    Scala详细总结(精辟版++)

    - **面向对象**:Scala是纯粹的面向对象语言,每一个值都是对象,所有的操作都是方法调用。 - **函数式编程**:Scala同时也是一个成熟的函数式编程语言,支持高阶函数、模式匹配等功能。 - **类型推断**:Scala具有...

    scala课件.zip

    Scala概述.pptx 变量.pptx 运算符.pptx 程序流程控制.pptx 函数式编程基础.pptx 面向对象编程(基础部分).pptx 面向对象编程(中级部分).pptx 面向对象编程(高级特性).pptx 隐式转换和隐式参数.pptx 集合(上)-基本使用...

    A Brief Introduction to Scala

    #### Scala概述 Scala是一种相对新兴的编程语言,旨在为Java虚拟机(JVM)以及后来的通用语言运行时(CLR)提供支持。它融合了函数式编程(Functional Programming, FP)与面向对象编程(Object-Oriented Programming, OOP...

    基于scala语言的spark操作,包含连接操作mysql,连接hdfs.zip

    本教程将探讨如何使用 Scala 语言来操作 Spark,并介绍如何与 MySQL 数据库和 HDFS(Hadoop 分布式文件系统)进行交互。以下是相关知识点的详细说明: **1. Scala 语言基础** Scala 是一种多范式编程语言,融合了...

    Scala 电子书

    Scala是一种多范式编程语言,它融合了面向对象和函数式编程的概念,旨在提供一种简洁、类型安全且高性能的编程体验。在这个电子书集合中,我们有三本关于Scala的重要书籍,分别是"Scala Tutorial"、"Programming in ...

    Scala语言规范.docx

    #### 一、Scala语言概述 **Scala**是一种强大的多范式编程语言,它将面向对象编程和函数式编程的最佳特性融合在一起。作为一种类Java的语言,Scala旨在提供比Java更简洁、更灵活且功能更丰富的编程体验。 - **面向...

    Scala in Action.pdf

    - **第3章:Scala中的面向对象编程** - **内容要点**:探讨Scala如何实现面向对象编程特性,并与Java等语言进行比较。 - **目标读者**:熟悉面向对象编程的开发者。 - **第4章:用函数式数据结构娱乐** - **...

    Learning.Scala.2014.12.pdf

    根据提供的文件信息,本书《Learning Scala》是一本旨在为读者提供Scala语言深入理解与实践操作的指南。Scala是一种结合了面向对象编程与函数式编程特性的强大语言,它运行在Java虚拟机(JVM)上,具有强大的类型...

    Scala语言规范.zip

    3. **面向对象编程**:Scala中的类可以有构造函数、方法、属性,同时支持单例对象和多重继承(通过特质实现)。它引入了“case class”来简化模式匹配,并且提供了隐式转换以增强类型兼容性。 4. **Actor模型**:...

    scala编程基础

    **Scala概述**: - **定义**:Scala是一种功能强大的编程语言,旨在集成面向对象编程和函数式编程的特点。它运行在Java平台上,并且与Java高度兼容。 - **为何选择Scala**: - **优雅性**:良好的API设计可以极大...

Global site tag (gtag.js) - Google Analytics