在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的也可以用其他字符串代替
网友评论