美文网首页
scala中的self =>

scala中的self =>

作者: 鸿乃江边鸟 | 来源:发表于2020-12-10 10:47 被阅读0次

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

相关文章

  • scala中的self =>

    在scala的一些开源项目的源码中总是能看到类似self =>关键字,那这到底代表什么呢?在此,记录一下,仅作为笔...

  • scala 容器详细解释

    scala 中的所有集合类位于 scala.collection 或 scala.collection.mutab...

  • Scala 简明速学04 集合-Map

    Scala 简明速学04 集合-Map Map Scala中Map提供键值对集合。 Map的初始化 Scala中的...

  • -6- 类型层次结构

    [参考link] Scala类型层次结构 与Java不同,Scala中没有原生类型。Scala中的所有数据类型都是...

  • scala中的静态-scala01

    在scala中没有static关键字,但是scala有自己特殊的实现静态内容的方式,这个方式就是scala中的...

  • 从零开始学习Spark(五)Scala进阶

    Scala进阶 在后面的文章中,会涉及到一些Scala中我们还没有接触到的语法。这篇Scala进阶会在Scala基...

  • 函数式编程理解

    函数式编程理解 1)Scala中函数的地位:一等公民2)Scala中的匿名函数(函数字面量)3)Scala中的高阶...

  • RUST中的self和Self

    self表示调用方法的对象,作为类方法的第一个参数,类似于C++中的this。 Self表示调用者的类型。 Rus...

  • [转]scala执行linux命令

    scala中执行外部命令(scala.sys.process)发表回复 目前 scala.sys.process ...

  • scala别名与自身类型

    this 别名 看scala的源码的话很发现很多源码开头都有一句:self => 这句相当于给this起了一个别名...

网友评论

      本文标题:scala中的self =>

      本文链接:https://www.haomeiwen.com/subject/nnplgktx.html