3.2. 操作(Operations)
Scala统一对象模型的另一个方面体现为每一个操作都是一个消息传递,也就是说是一个方法调用。例如:x与y相加操作x+y被解释为x.+y,也就是调用x这个对象的方法+,而y是该方法的参数。这种思想最早在Smalltalk中实现,在Scala中得到进一步改进,形成如下语法规约:首先,Scala将操作符作为普通标识符,也就是说,任何标识符或者以字母开头的一串字符、数字形成,或者以一串操作符形成。因此我们可以定义诸如+、<=、::等名称的方法。其次,Scala将任何两个表达式之间的标识符视为一个方法调用,例如:前述列表1当中的代码中,我们可以用(arg startsWith "-")作为语法糖(syntactic sugar)来替代默认的用法(arg.startsWith("-"))。
下面用一个例子来说明用户自定义操作符如何声明和使用:一个表示自然数的类Nat,它用Zero和Succ这两个类的实例来表示一个数字(当然很低效),每一个数字N用new SuccN(Zero)来表示。我们先定义一个抽象类来描述自然数所支持的所有操作。根据Nat的定义,自然数有两个抽象方法:isZero、pred,和三个具体方法:succ、+、-。
abstract class Nat {
def isZero: Boolean
def pred: Nat
def succ: Nat = new Succ(this)
def + (x: Nat): Nat =
if (x.isZero) this else succ + x.pred
def - (x: Nat): Nat =
if (x.isZero) this else pred -x.pred
}
注意Scala允许定义无参数方法,这种方法一旦名字被引用到即会调用,无需传递参数列表。另外,Scala类的抽象成员在语法上就通过没有定义来体现,无需添加abstract修饰符。
现在我们通过一个单例对象Zero和一个类Succ来扩展Nat,分别表示0和非0的自然数。
object Zero extends Nat {
def isZero: Boolean = true
def pred: Nat = throw new Error("Zero.pred")
override def toString: String = "Zero"
}
class Succ(n: Nat) extends Nat {
def isZero: Boolean = false
def pred: Nat = n
override def toString: String = "Succ("+n+")"
}
Succ类显示了Scala和Java的一些不同之处:Scala中类的构造函数紧接着类的名称出现,不需要在类的定义体中出现与类同名的构造函数。这样的构造函数称为主构造函数(primary constructor),当一个主构造函数因为对象实例化而被调用时,整个类定义被调用。另外还存在次构造函数的语法定义,用于需要不止一个构造函数的情况,参见[35]的第5.2.1节。
Zero对象和Succ类都实现了其父类Nat的两个抽象方法,同时还都覆盖了从Any继承来的toString方法。override关键字在覆盖被继承类的具体方法时是必须的,而用于实现父类中的抽象方法时则可以省略。这个操作符给出足够的冗余用来避免两类错误:一个是意外覆盖,即子类并不是有意覆盖父类中的方法,此时编译器将给出没有override操作符的错误信息。另一种类型的错误是覆盖路径中断,即父类方法参数变了,但没有修改子类对应方法,此时Scala编译器会给出没覆盖任何方法的错误信息,而不是自动将这个子类方法视为重载(overloading)。
允许用户自定义中缀(infix)操作符引出一个问题,即他们的优先级和结合性(precedence and associativity)。一个解决方案是像Haskell或SML那样在定义每一个操作符时可以给出“结合度”(fixity),但是这种方式与模块化编程之间不能很好交互。Scala采用一种相对简化的固定优先级与结合性的策略。每个中缀操作符由其第一个字符所决定,这与Java当中所有以非字母字符开头的操作符的优先级是一致的。下面是从低到高的操作符优先级:
(所有字母)
|
^
&
<、>
=、!
:
+、*
/、%
(所有其他特殊字符)
操作符一般是左结合的,x+y+z被解释为(x+y)+z,唯一的例外是以冒号(:)结尾的操作符是右结合的。一个例子是列表构造(list-consing)操作符“::”,xx::y::zs被解释为x::(y::zs)。右结合的操作符在方法方法查找上也是相反的,左结合操作符以其左方对象作为消息接收者,右结合操作符当然以右方对象为消息接收者。例如:x::y::zs被视作zs.::(y).::(x)。实际上,::是Scala的List类的一个方法,他将该方法参数对应的列表添加在接收消息的对象对应的列表的前面,并将合并成的新列表作为结果返回。
分享到:
相关推荐
Scala 概述(瑞士洛桑联邦理工) Scala 概述(瑞士洛桑联邦理工)
史上最强思维导图记忆scala array方法
Scala概述.pptx 变量.pptx 运算符.pptx 程序流程控制.pptx 函数式编程基础.pptx 面向对象编程(基础部分).pptx 面向对象编程(中级部分).pptx 面向对象编程(高级特性).pptx 隐式转换和隐式参数.pptx 集合(上)-基本使用...
第13讲-Scala编程详解:面向对象编程之对象 共9页 第14讲-Scala编程详解:面向对象编程之继承 共13页 第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程...
wootjs, Scala 和JavaScript通过 Scala.js的WOOT模型 带 Scala.js的 WOOT协作文本编辑,使用WOOT算法。在 Scala 中实现,在JVM和JavaScript解释器上运行。不耐烦的 $ sbt server/run 然后打开 http:
spark,scala编程指南第三版,非常好的资料,高清无水印
Scala面向对象
《Scala编程》介绍了一种新的编程语言,它把面向对象和函数式编程概念有机地结合为整体,从而形成一种完整统一、语义丰富的新思维体系。《Scala编程》循序渐进,由浅入深,经作者精心组织、仔细编排,将语言中的各种...
Scala程序设计第2版 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在Java虚拟机上,并兼容现有的Java程序。
Scala编程(第三版)中英文,代码全 Martin Odersky 是Scala 编程语言的缔造者。他是瑞士洛桑理工学院(EPFL)的教授,同时也是Typesafe, Inc.(已更名为Lightbend)的创始人。他的研究方向是编程语言和系统,更具体...
采用ARIMA模型(自回归积分滑动平均模型)+三次指数平滑法(Holt-Winters),用scala语言实现的在spark平台运行的分布式时间序列预测算法
第13讲-Scala编程详解:面向对象编程之对象 共9页 第14讲-Scala编程详解:面向对象编程之继承 共13页 第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程...
第13讲-Scala编程详解:面向对象编程之对象 共9页 第14讲-Scala编程详解:面向对象编程之继承 共13页 第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程...
文件类型包括9个XML配置文件、2个CRC文件、2个Scala源代码文件、1个名称文件、1个Markdown文档、1个Parquet数据文件、1个名称列表文件、1个TXT文本文件、1个PMML文件和1个Java源代码文件。该系统利用JPMML-Spark将...
Scala类和对象.md
1.1.1 富有魅力的Scala 2 1.1.2 关于Java 8 3 1.2 安装Scala 3 1.2.1 使用SBT 5 1.2.2 执行Scala命令行工具 6 1.2.3 在IDE中运行Scala REPL 8 1.3 使用Scala 8 1.4 并发 17 1.5 本章回顾与...
scala中没有Java中的静态成员,我们想要定义类似于Java的static变量、static方法,就要使用到scala中的单例对象——object. 定义单例对象 单例对象表示全局仅有一个对象(类似于Java static概念) 定义单例对象和...
本书是programming in scala的英文第三版,高清英文原版。
Scala语言规范-Scala 是一门类 Java 的编程语言,它结合了面向对象编程和函数式编程。 Scala 是纯面向对象的,每个值都是一个对象,对象的类型和行为由类定义,不同的类可以通过混入(mixin)的方式组合在一起。 Scala...
Eclipse Scala环境的配置 https://yanxml.blog.csdn.net/article/details/89250222 配套的下载资源. http://alchim31.free.fr/m2e-scala/update-site/ 这个地址被墙了.上传,方便大家离线安装`m2e-scala`.