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

Scala概述(三)统一的对象模型(2)

阅读更多

3.2.    操作(Operations

Scala统一对象模型的另一个方面体现为每一个操作都是一个消息传递,也就是说是一个方法调用。例如xy相加操作x+y被解释为x.+y,也就是调用x这个对象的方法+,而y是该方法的参数。这种思想最早在Smalltalk中实现,在Scala中得到进一步改进,形成如下语法规约:首先,Scala将操作符作为普通标识符,也就是说,任何标识符或者以字母开头的一串字符、数字形成,或者以一串操作符形成。因此我们可以定义诸如+<=::等名称的方法。其次,Scala将任何两个表达式之间的标识符视为一个方法调用,例如:前述列表1中的代码中,我们可以用(arg startsWith "-")作为语法糖(syntactic sugar来替代默认的用法(arg.startsWith("-"))

下面用一个例子来说明用户自定义操作符如何声明和使用:一个表示自然数的类Nat,它用ZeroSucc这两个类的实例来表示一个数字(当然很低效),每一个数字Nnew SuccN(Zero)来表示。我们先定义一个抽象类来描述自然数所支持的所有操作。根据Nat的定义,自然数有两个抽象方法:isZeropred,和三个具体方法: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类显示了ScalaJava的一些不同之处:Scala中类的构造函数紧接着类的名称出现,不需要在类的定义体中出现与类同名的构造函数。这样的构造函数称为主构造函数(primary constructor),当一个主构造函数因为对象实例化而被调用时,整个类定义被调用。另外还存在次构造函数的语法定义,用于需要不止一个构造函数的情况,参见[35]的第5.2.1节。

Zero对象和Succ类都实现了其父类Nat的两个抽象方法,同时还都覆盖了从Any继承来的toString方法。override关键字在覆盖被继承类的具体方法时是必须的,而用于实现父类中的抽象方法时则可以省略。这个操作符给出足够的冗余用来避免两类错误:一个是意外覆盖,即子类并不是有意覆盖父类中的方法,此时编译器将给出没有override操作符的错误信息。另一种类型的错误是覆盖路径中断,即父类方法参数变了,但没有修改子类对应方法,此时Scala编译器会给出没覆盖任何方法的错误信息,而不是自动将这个子类方法视为重载(overloading)。

允许用户自定义中缀(infix)操作符引出一个问题,即他们的优先级和结合性(precedence and associativity)。一个解决方案是像HaskellSML那样在定义每一个操作符时可以给出“结合度”(fixity),但是这种方式与模块化编程之间不能很好交互。Scala采用一种相对简化的固定优先级与结合性的策略。每个中缀操作符由其第一个字符所决定,这与Java当中所有以非字母字符开头的操作符的优先级是一致的。下面是从低到高的操作符优先级:

(所有字母)

|

^

&

<>

=!

:

+*

/%

(所有其他特殊字符)

 

       操作符一般是左结合的,x+y+z被解释为(x+y+z,唯一的例外是以冒号(:)结尾的操作符是右结合的。一个例子是列表构造(list-consing)操作符“::”,xx::y::zs被解释为x::(y::zs)。右结合的操作符在方法方法查找上也是相反的,左结合操作符以其左方对象作为消息接收者,右结合操作符当然以右方对象为消息接收者。例如:x::y::zs被视作zs.::(y).::(x)。实际上,::ScalaList类的一个方法,他将该方法参数对应的列表添加在接收消息的对象对应的列表的前面,并将合并成的新列表作为结果返回。

分享到:
评论

相关推荐

    A Brief Introduction to Scala

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

    Programming in Scala 2nd Edition

    2. **面向对象编程**:探讨Scala如何支持面向对象编程,包括类、对象、继承、多态等概念。 3. **函数式编程**:介绍函数式编程的核心理念,如纯函数、高阶函数、递归等,并展示了如何在Scala中实现这些概念。 4. **...

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

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

    Scala 电子书

    这三本书将帮助读者深入理解Scala的核心概念、语法特性以及在实际开发中的应用。 "Scala Tutorial"可能是为初学者设计的,它通常会涵盖基础语法,如变量声明、数据类型、控制流结构、类与对象的定义,以及函数式...

    programming in scala

    2. **面向对象与函数式的结合**:Scala同时支持面向对象编程和函数式编程,这意味着开发者可以根据具体的需求选择最适合的编程范式。这种混合型的编程风格提供了高度的灵活性。 3. **静态类型**:Scala是一种静态...

    Learning Concurrent Programming in Scala

    2. **Scala并发模型**:深入探讨Scala提供的各种并发机制,如Futures、Promises、Actors等,并解释它们的工作原理及应用场景。 3. **并发编程模式**:学习不同的并发编程模式,比如共享内存模型和消息传递模型,并...

    scala介绍

    1. **语言概述**:Scala由Martin Odersky在2003年创建,它的名字是“Scalable Language”的缩写,意在表达其设计目标是能够随着系统规模的扩大而平滑扩展。Scala运行在Java虚拟机(JVM)上,因此它可以无缝地利用...

    Scala语言规范.zip

    4. **Actor模型**:Scala内置了Akka库,它是基于Actor模型的并发处理框架,允许程序员创建能够并发执行且互不干扰的独立实体。 5. **表达式和控制流**:Scala的控制流语句,如if-else、for-comprehensions和while...

    经典书籍 Scala for the Impatient.pdf

    2. **面向对象编程**:作为一门支持面向对象特性的语言,Scala允许开发者定义类、继承和多态。书中详细讲解了如何在Scala中实现这些概念,以及它们与传统面向对象语言的区别。 3. **函数式编程**:Scala也支持函数式...

    Scala impatient

    2. **强大的并发模型**:Scala提供了Actors模型来实现并发编程,这种模型可以有效地处理大规模并发任务,降低了编写并发代码的复杂度。 3. **静态类型检查**:Scala是一种静态类型的语言,这意味着编译器可以在编译...

    scala 编程语言

    #### 一、Scala编程语言概述 Scala是一种现代的多范式编程语言,它结合了面向对象编程和函数式编程的特点。Scala的设计目标是解决Java等传统面向对象语言在扩展性和灵活性方面的局限性,同时保持与现有Java生态系统...

    Beginning Scala

    - **Actor模型**:Scala提供了Actor模型来实现并发编程,这是一种基于消息传递的并发模型,非常适合构建高并发应用。 - **Future与Promise**:Scala的`scala.concurrent`包提供了Future和Promise机制,用于处理异步...

    大数据技术之Spark编程基础-第2章-Scala语言基础(共155页).pptx

    2.1 Scala语言概述 - 计算机的缘起:讲解了λ演算和图灵机对现代计算机科学的影响,λ演算是函数式编程的基础,而图灵机则启发了冯·诺依曼的计算机体系结构。 - 编程范式:介绍了命令式编程(如C++、Java)和函数式...

    Scala_2.7.6_API.chm.7z

    2. **对象与类**:在Scala中,类和对象是主要的结构单元。类用于创建实例,而对象可以被视为单例类,它们提供了一种全局访问点,常用于实现模式匹配或作为工具类。 3. **特质(Traits)**:Scala的特质类似于Java的...

    scala编程指导文档

    #### 一、Scala语言概述 Scala是一种多范式编程语言,结合了面向对象编程和函数式编程的特点,运行在Java平台(JVM)上。它既能够提供静态类型检查的安全性,又能实现动态语言的灵活性。Scala的设计目标是解决Java的...

    Scala编程完整版

    Scala编程是一种强大的、多范式的编程语言,它融合了面向对象和函数式编程的概念,旨在提高程序员的生产力和代码的可读性。Scala运行在Java虚拟机(JVM)上,因此可以无缝集成Java库,并利用Java平台的广泛生态系统...

Global site tag (gtag.js) - Google Analytics