首页 > 解决方案 > scala新类中的“自我”含义是什么

问题描述

最近我正在阅读火花的来源。当到达“org.apache.spark.deploy.SparkSubmit”类时,我对关键字“self”和运算符“=>”感到困惑。有人可以解释我吗?

override def main(args: Array[String]): Unit = {
val submit = new SparkSubmit() {
  self =>

  override protected def parseArguments(args: Array[String]): SparkSubmitArguments = {
    new SparkSubmitArguments(args) {
      override protected def logInfo(msg: => String): Unit = self.logInfo(msg)

      override protected def logWarning(msg: => String): Unit = self.logWarning(msg)
    }
  }

  override protected def logInfo(msg: => String): Unit = printMessage(msg)

  override protected def logWarning(msg: => String): Unit = printMessage(s"Warning: $msg")

  override def doSubmit(args: Array[String]): Unit = {
    try {
      super.doSubmit(args)
    } catch {
      case e: SparkUserAppException =>
        exitFn(e.exitCode)
      case e: SparkException =>
        printErrorAndExit(e.getMessage())
    }
  }

}

BTW:这个问题与“重复问题”完全不同。尽管这两个非常相似,但我要问的是关于“新类”关键字附近的“self =>”,而不是scala的类定义中带有“some name =>”的“duplicated”。这不是同一个问题

标签: scalaapache-sparkself

解决方案


该声明

self =>

被称为“自我类型注释”,它创建一个名为的值,该值self引用正在构造的类的实例。这可以用于this类的值不可用的地方。特别是,它可以在嵌套类内部使用,其中this引用嵌套类并且对外部类的引用不会自动获得。

在您的情况下,self此处使用:

new SparkSubmitArguments(args) {
  override protected def logInfo(msg: => String): Unit = self.logInfo(msg)

  override protected def logWarning(msg: => String): Unit = self.logWarning(msg)
}

这使得新实例SparkSubmitArguments使用外部包含类的logInfologWaringing方法。您不能this在此时使用代码,因为它会引用内部类,而不是外部类。(如果你在this这里使用你会得到一个无限循环)


推荐阅读