所以我读到 App 特征具有以下字段:
def delayedInit(body: ⇒ Unit): Unit
val executionStart: Long
def main(args: Array[String]): Unit
我知道,如果一个特征只有一种方法,通过在类声明中的大括号之间“放置代码”,我可以覆盖它。但这里我有两种方法。那么为什么我要自动覆盖 main 而不是delayedInit 呢?
你没有压倒一切main
method.
Since App
延伸DelayedInit http://www.scala-lang.org/api/current/#scala.DelayedInit编译器会像这样重写你的代码:
// Before:
object Test extends App {
println("test")
}
// After:
object Test extends App {
delayedInit{println("test")}
}
From DelayedInit
文档 http://www.scala-lang.org/api/current/index.html#scala.DelayedInit:
类和对象(但请注意,不是特征)继承DelayedInit
标记特征将有其初始化代码
重写如下:code
变成delayedInit(code)
.
App
trait 实施 https://github.com/scala/scala/blob/v2.10.3/src/library/scala/App.scala#L59 delayedInit
像这样:
override def delayedInit(body: => Unit) {
initCode += (() => body)
}
So in Test
对象构造函数代码println("test")
存储为函数(() => Unit
) in initCode
field.
main
的方法App
被实现为对存储在的所有函数的调用initCode
field:
for (proc <- initCode) proc()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)