看scala的源码的话很发现很多源码开头都有一句:self => 这句相当于给this起了一个别名为self
class Self {
self => //代表this指针 ,也就是说 self 就 this的别名
val tmp = "scala"
def foo = self.tmp + this.tmp
}
self不是关键字,可以用除了this外的任何名字命名(除关键字)。就上面的代码,在Self 内部,可以用this指代当前对象,也可以用self指代,两者是等价的。
self type 两种使用场景
一、 用在有内部类的情况
如:
class Outer {
out =>
val v1= "spark"
class Inner {
println(out.v1) // 用outer表示外部类,相当于Outer.this
v1
}
}
二、 对子类(或者对象)的约束
trait S1
/**
* this 不能称当别名,这里this:S1 是一个整体,就是说实例化S2时,要求S1必须混入
*/
class S2 {this:S1 =>} // 混入trait S1,强制要求 S2的实现类 去实现 S1
class S3 extends S2 with S1
trait T {this:S1 => }
object S4 extends T with S1
this:S1 => 要求S2在实例化时或定义S2的子类时,必须混入指定的S1 类型,这个X类型也可以指定为当前类型
自身类型的存在相当于让当前类变得“抽象”了,它假设当前对象(this)也符合指定的类型,因为自身类型 this:S1 =>的存在,当前类构造实例时需要同时满足S1类型
写的不对的地方,烦请指点