我正在Scala in Depth中查看DelayedInit
...
注释是我对代码的理解。
以下特征接受一个参数,该参数是非严格评估的(由于=>
),并返回Unit
。它的行为类似于构造函数。
trait DelayedInit {
def delayedInit(x: => Unit): Unit
}
据我了解
App
,此特征具有一个var x
,它等于0-arity(无参数)的函数。根据对x
方法的调用分配delayedInit
。然后,如果
main
具有apply '_()'
类型,它将在x
上调用Some(Function0[Unit])
。如果x
是None
,那么将不会发生任何事情。trait App extends DelayedInit {
var x: Option[Function0[Unit]] = None
override def delayedInit(cons: => Unit) {
x = Some(() => cons)
}
def main(args: Array[String]): Unit =
x.foreach(_())
}
然后,按照本书的示例去REPL:
scala> val x = new App { println("Now I'm initialized") }
x: java.lang.Object with App = $anon$1@2013b9fb
我看到了...的输出
scala> x.main(Array())
没有什么。
构造
App
实例是否应该导致调用delayedInit
,以便x.main(Array())
返回类似构造函数的行为?或者,更具体地说,应该打印出Now I'm initialized
吗? 最佳答案
我猜想您在与DelayedInit
相同的文件中定义了自己的App
特性。如果这样做,请将其删除,DelayedInit
是scala
包内的一个特征。
我刚从书中获得了代码,然后将其粘贴到Eclipse工作表中,它就可以正常工作。
编辑
发生的事情是,delayedInit内部的代码在使用新App {println(“Now I'm initialized”)创建的匿名App对象的构造函数之前被调用。您可以在以下屏幕截图中看到它:
如果您决定删除此行:
x = Some(() => cons)
您会看到现在我从未初始化过。因为您要创建的匿名
App
对象的构造函数代码已赋予delayedInit
方法,但从未在任何地方运行,所以App
的对象构造函数永远不会运行。关于scala - 了解DelayedInit,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20649982/