一、对象
1.伴生对象:与类同名的对象,类和它的伴生对象可以相互访问私有特性,但是它们必须存在于同一个源文件中。
2.对象的apply方法:经常被用在伴生对象中,可以不用构造器,省去new关键字,方便很多。注意Array(100)与new Array(100)的区别:
Array(100) //调用的是apply(100),输出一个只含有一个元素(100)的Array
new Array(100) //调用构造器this(100),生成一个含有100个null元素的Array
3.对象的update方法:
val scores = new scala.collection.mutable.HashMap[String,Int]
scores("Bob") = 100 //调用scores.update("Bob",100)
val bobscores = scores("Bob") //调用scores.apply("Bob")
4.提取器:所谓提取器就是一个带有unapply方法的对象,可以把unapply方法看成伴生对象中apply方法的方向操作。apply方法接收参数然后把他们变成对象,unapply方法接收对象然后把值赋给参数。
class Fraction(n:Int,m:Int){
...
}
object Fraction(){
def apply(n:Int,m:Int) = new Fraction(n,m)
// 伴生对象的apply方法
def unapply(input:Fraction)=
if(input.den == 0) None else Some((input.num,input.den))
// 伴生对象的unapply方法
}
上面定义了一个Fraction类,apply方法根据分子和分母创建一个分数,unapply则根据一个分数提取出分子和分母。
var Fraction(a,b) = Fraction(3,4)*Fraction(2,5)
// a和b分别被初始化成运算结果的分子和分母
或者用于模式匹配:
case Fraction(a,b) => ...
// a和b分别被绑到分子和分母
要提取任意长度的值得序列,我们应该用unapplySeq来命名我们的方法,它返回一个Option[Seq[A]],其中A是被提取值得类型。