`
edge
  • 浏览: 66776 次
  • 性别: 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 概述(瑞士洛桑联邦理工) Scala 概述(瑞士洛桑联邦理工)

    scala3 scala3 scala3 scala3 scala3

    scala3 scala3 scala3 scala3 scala3

    scala 3本书打包

    随着spark兴起,scala作为spark项目的开发语言也越来越受到大家的关注。这种函数式与面向对象的编程语言极大的简化了代码的编写量,同时它就是为并发式编程而生的。这个打包文件中包含了《SCALA程序设计-JAVA虚拟机...

    Scala编程(第3版)

    由直接参与Scala开发的一线人员编写,因而对原理的解读和应用的把握更加值得信赖。...即便是不直接使用Scala或从事一线编程工作的读者,也能从《Scala编程(第3版)》学到大量关于函数式和面向对象的编程概念和技巧。

    scala课件.zip

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

    programming in scala, 3nd edition

    programming in scala, 3nd edition

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

    第3讲-Scala编程详解:基础语法 共8页 第4讲-Scala编程详解:条件控制与循环 共7页 第5讲-Scala编程详解:函数入门 共5页 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共5页 第7讲-Scala编程详解:函数入门...

    Scala程序设计第2版

    Scala程序设计第2版 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在Java虚拟机上,并兼容现有的Java程序。

    scala-intellij-bin-2020.2.3.zip

    scala-intellij-bin-2020.2.3.zip

    Scala编程 第3版中文版.7z

    《Scala编程(第3版)》由直接参与Scala开发的一线人员编写,因而对原理的解读和应用的...即便是不直接使用Scala或从事一线编程工作的读者,也能从《Scala编程(第3版)》学到大量关于函数式和面向对象的编程概念和技巧

    Programming in Scala 2nd Edition 英文版

    《Scala编程》介绍了一种新的编程语言,它把面向对象和函数式编程概念有机地结合为整体,从而形成一种完整统一、语义丰富的新思维体系。《Scala编程》循序渐进,由浅入深,经作者精心组织、仔细编排,将语言中的各种...

    Scala函数式编程

    3 用scala做过一个2年期的项目 在使用scala的过程中,碰到的问题主要体现在: 1 scala的很多语法糖不理解,不知道为啥要这么写,有种为了这么写的简洁而这么写的感觉 2 scala很多库在设计的时候,不理解原因,...

    scala API 操作hbase表

    最近看了hbase的源码根据源码写了一些scala调动hbase表的API,话不多说直接上代码!Hadoop的版本是2.7.3,scala版本是2.1.1,hbase的版本是1.1.2 如果版本不同可以修改pom的依赖项,但要注意版本冲突。 并且在scala...

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

    第3讲-Scala编程详解:基础语法 共8页 第4讲-Scala编程详解:条件控制与循环 共7页 第5讲-Scala编程详解:函数入门 共5页 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共5页 第7讲-Scala编程详解:函数入门...

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

    第3讲-Scala编程详解:基础语法 共8页 第4讲-Scala编程详解:条件控制与循环 共7页 第5讲-Scala编程详解:函数入门 共5页 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共5页 第7讲-Scala编程详解:函数入门...

    scala-intellij-bin-2018.3.2.zip

    scala-intellij-bin-2018.3.2.zip插件,亲测可用!!!scala-intellij-bin-2018.3.2.zip插件,亲测可用!!!scala-intellij-bin-2018.3.2.zip插件,亲测可用!!!

    m2e-scala.zip

    Eclipse Scala环境的配置 https://yanxml.blog.csdn.net/article/details/89250222 配套的下载资源. http://alchim31.free.fr/m2e-scala/update-site/ 这个地址被墙了.上传,方便大家离线安装`m2e-scala`.

    Scala语言规范-2019.rar

    Scala 的设计目的是要和两种主流面向对象编程语言Java 和 C#实现无缝互操作,这两种主流语言都非纯面向对象。 Scala 也是一门函数式变成语言,每个函数都是一个值,原生支持嵌套函数定义和高阶函数。 Scala 也支持...

    Scala编程实战.zip

    此文档是讲解实战Scala,希望对喜欢大数据的同学有所帮助!!! 学习Scala语言,不仅仅意味着熟悉新的API,更重要的是...对于Scala新手来说这是一本不错的入门书,对于老手来说也是一本夯实基础,检视自己所学知识的好书。

    Scala面向对象.docx

    Scala面向对象

Global site tag (gtag.js) - Google Analytics