Scala编程第3版第六章(函数式对象)
2020-02-19 13:37:23    13    0    0
yuziyue

Rational类的规格定义

有理数(rational number)是可以用比例表示的数,比如 1/2 4/5等等,其中包含了分子(numerator)分母(denominator)。跟浮点数相比,有理数的优势是小数是精确展现的,而不会舍入或取近似值。本章节会设计一个有理数的对象,它包括了一些常用的功能。

 

Rational对象是不可变的,每一个有理数都会有一个Rational对象来表示。当你把两个Rational对象相加时,你将会创建一个新的Rational对象来持有它们的和。

Class Rational(n: Int, d: Int){
    require(d != 0)
    private val g = gcd(n.abs, d.abs)
    val numer = n / g
    val denom = d / g
    def this(n: Int) = this(n, 1)
    def + (that: Rational): Rational = new Rational(
        numer * that.denom + that.numer * denom,
        denom * that.denom
    )
    def + (i: Int): Rational = new Rational(numer + i * denom, denom)
    
    def - (that: Rational): Rational = new Rational(
        numer * that.denom - that.numer * denom,
        denom * that.denom
    )
    def - (i: Int): Rational = new Rational(numer - i * denom, denom)
    
    def * (that: Rational): Rational =
        new Rational(numer * that.numer, denom * that.denom)
    def * (i: Int): Rational = new Rational(numer * i, denom)
    
    def / (that: Rational): Rational = 
        new Rational(numer * that.denom, denom * that.numer)
    def / (i: int): Rational = new Rational(numer, denom * i)
    
    override def toString = numer + "/" + denom
    private def gcd (a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b)
}
  • 覆写toString方法:默认的打印内容
  • 前置条件:使用require函数
  • 自引用:this表示对象自身
  • 辅助构造函数:额外的构造函数,每个辅助构造方法都必须首先调用同一个类的另一个构造方法,这个构造方法可以是另一个辅助方法、也可以是主构造方法。在Java中,构造方法要么调用同一个类的另一个构造方法,要么直接调用超类的构造方法。而在Scala类中,只有主构造方法可以调用超类的构造方法。
  • 方法重载:要想对一个有理数和整数进行计算,就需要对方法进行重载,根据传入的类型进行判断调用哪个方法。
  • 现在还有一个问题:如果计算 2 * Rational(2, 3) 会报错,因为2是一个Int实例,它并没有定义Rational的输入,所以这里需要做一个隐式转换 implicit def intToRational(x: Int) = new Rational(x)

 

Scala中的标识符

 

 

字母数字组合标识符以字母或下划线开头,可以包含更多的字母、数字、下划线。字符 $ 也算字母,但是它是预留个Scala编译器生成的标识符。Scala和Java一样也使用驼峰命名法,需要注意的是,下划线在Scala代码中还有其他非标识符的用法,所以标识符最好都使用驼峰命名法。

 

如果标识符以下划线结尾,需要注意的是,下划线后面的 : 需要有一个空格。因为没有空格的话,编译器会认为要声明的变量名称是 name_:

// 报错
val name_: Int = 1

// 不会报错
val name_ : Int = 1

 

在Scala中,常量通常用下划线连接的全大写表示,比如MAX_VALUE,而在Java中习惯用大驼峰的命名方式比如MaxValue。

 

操作标识符

操作标识符(operator identifier)由一个或多个操作字符构成,操作字符指的是那些可以被打印出来的ASCII字符,比如 +  ++  :::  <?>  :->

 

混合标识符

混合标识符(mixed identifier)由一个字母数字组合操作符、一个下画线和一个符号操作符组成。例如,unary_+这个表示+操作符的方法名,或者myvar_=这个表示赋值的方法名。除此之外,形如myvar_=这样的混合标识符也被Scala编译器用来支持属性(properties)

 

字面标识符

字面标识符(literal identifier)是用反引号括起来的任意字符串(`...`)。 

 

 

 

上一篇: Scala编程第3版第七章(内建控制结构)

下一篇: Scala编程第3版第五章(基础类型和操作)

13 人读过
文档导航