Essential Scala: Objects and Classes

Classes

类是用于创建具有相同字段和方法的对象的模板.

类定义语法:

class Name(parameter: type, ...) { 
   declarationOrExpression ...
}

或:

class Name(val parameter: type, ...) { 
   declarationOrExpression ...
}
  1. Name是类名
  2. parameter是类构造参数名
  3. type是构造参数类型
  4. 可选的declarationOrExpression是声明或表达式

Objects and Functions

Scala中,如果一个对象拥有一个apply方法,该对象可以向函数一样进行调用.

class Adder(amount: Int) {
  def apply(in: Int): Int = in + amount
}
val add3 = new Adder(3)
// add3: Adder = Adder@1d4f0fb4
add3(2) // shorthand for add3.apply(2) 
// res: Int = 5

Companion Objects

Scala中使用单例对象实现Java中的静态方法.

class Timestamp(val seconds: Long)

object Timestamp {
    def apply(hours: Int, minutes: Int, seconds: Int): Timestamp =
        new Timestamp(hours*60*60 + minutes*60 + seconds) 
}

Timestamp(1, 1, 1).seconds // res: Long = 3661

伴生对象声明语法:

class Name { 
    ...
}
object Name { 
    ...
}

Case Classes

Case Class的特性:

  1. 不再需要在构造参数中定义参数为val
  2. 默认提供的toString方法
  3. 智能的equal,操作与对象字段值得hashCode方法
  4. copy方法:使用当前对象已有字段值创建新的对象

Case Object

如果定义case class时不需要构造参数,就可以把它定义成一个case object.

两者的不同:

  1. case object 同时定义了一个class和object,object作为该class唯一一个实例.
  2. 同时拥有case class的特性

Pattern Matching

模式匹配声明语法:

expr0 match {
    case pattern1 => expr1 
    case pattern2 => expr2 
    ...
}
  1. expr0将绑定表达式的结果
  2. pattern1,pattern2等待适用于匹配的模式,并且按照罗列顺序
  3. expr1,expr2是匹配后进行求值的表达式