что означает «я» в новом классе скалы - PullRequest
0 голосов
/ 26 августа 2018

недавно читаю источник искры. Достигнув класса «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())
    }
  }

}

Кстати: этот вопрос полностью отличается от «дублированного». Хотя эти два слова очень похожи, я спрашиваю о «self =>» рядом с ключевым словом «new class», а не о «дублированном» с «some name =>» в определении класса scala. это не тот же вопрос

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Заявление

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 использовать методы logInfo и logWaringing из внешнего содержащего класса. Вы не можете использовать this в этой точке кода, потому что он будет ссылаться на внутренний класс, а не на внешний класс. (Если вы здесь используете this, вы получите бесконечный цикл)

0 голосов
/ 26 августа 2018

Это псевдоним для this.Это сделано для устранения неоднозначности самореференции во внутренних классах.

Когда вы используете this в области видимости внутреннего класса, он ссылается на экземпляр внутреннего класса.Если вам нужна ссылка на внешний класс, вам понадобится псевдоним:

  class Foo { self => 
    val x = 1
    new AnyRef { 
      val x = 2
      println(this.x) // 2
      println(self.x) // 1
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...