在scala的一些开源项目的源码中总是能看到类似self =>关键字,那这到底代表什么呢?在此,记录一下,仅作为笔记
- this 别名
这种相当于给this起了一个别名self,这里的self可以换成其他的你自己喜欢的字符串,看一下spark的源码sparkSession的定义:
class SparkSession private( @transient val sparkContext: SparkContext, @transient private val existingSharedState: Option[SharedState], @transient private val parentSessionState: Option[SessionState], @transient private[sql] val extensions: SparkSessionExtensions) extends Serializable with Closeable with Logging { self => ... @Unstable @transient lazy val sessionState: SessionState = { parentSessionState .map(_.clone(this)) .getOrElse { val state = SparkSession.instantiateSessionState( SparkSession.sessionStateClassName(sparkContext.conf), self) initialSessionOptions.foreach { case (k, v) => state.conf.setConfString(k, v) } state } }
该段中用self作为this的别名,在sessionState的构造中引用了该self别名
自身类型
当self 后面带类型的时候,这个时候就不是别名了,就是自身类型了,什么意思呢?
也就是说当类中定义了类似self: X =>以后,该类实例化或者子类的实现的时候,必须混入X类型,当然X的类型 也可以是定义该类的自身类型。
看一下spark的源码TreeNode的定义以及实现类:
abstract class TreeNode[BaseType <: TreeNode[BaseType]] extends Product { // scalastyle:on self: BaseType => val origin: Origin = CurrentOrigin.get case class Abs(child: Expression) extends UnaryExpression with ExpectsInputTypes with NullIntolerant { override def inputTypes: Seq[AbstractDataType] = Seq(NumericType) abstract class UnaryExpression extends Expression
可以知道TreeNode的子类Abs 范型为Expression,而Abs继承了UnaryExpression ,而UnaryExpression继承了Expression
当然该self的也可以用其他字符串代替