scala - 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”。这不是同一个问题
解决方案
该声明
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
这里使用你会得到一个无限循环)
推荐阅读
- javascript - 如何清除ajax响应数据?
- sql - 在 Sybase SQL Server 中获取 yyyymmdd 日期的上周日期
- office365 - 是否可以从 power point web 插件获取登录用户的用户名?
- java - 即使我更改了条件的值,我的 do-while 循环似乎也一直在运行
- python - 如何将 cv2.imread 与 tkinter 连接?
- user-interface - Modelica:检查可替换包或模型的相等性
- vba - 使用 Workspace.openDatabase 上的 Jet 语句的 Visual Basic 语句出错
- javascript - 订购带有时间和点的帖子(如reddit)firestore
- python - 读取 Pcap 并将其写入 csv 文件 python
- visual-studio-2019 - windows 10中windbg Preview的位置是什么?以及如何在visual studio 2019中重命名项目名称?