我正在查看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(_())
}
,则不会发生任何事情。
scala> val x = new App { println("Now I'm initialized") }
x: java.lang.Object with App = $anon$1@2013b9fb
然后,按照本书的例子我去了REPL:
scala> x.main(Array())
我看到......
的输出 App
什么都没有。
构建delayedInit
实例是否会导致调用x.main(Array())
以便Now I'm initialized
返回构造函数类似的行为?或者,更具体地说,是否应该{{1}}打印出来?
答案 0 :(得分:7)
我猜你在与DelayedInit
相同的文件中定义了自己的App
特征。如果您这样做,请将其删除,DelayedInit
是scala
包中的特征。
我刚刚从书中获得了代码并粘贴到Eclipse工作表中,它就可以正常工作了。
修改强>
当使用新的应用程序{println(“现在我已经初始化”)}创建的匿名App对象的构造函数之前,才会调用delayedInit中的代码。您可以在此屏幕截图中看到它:
如果您决定删除此行:
x = Some(() => cons)
您将看到现在我已初始化从未打印过。因为您正在创建的匿名App
对象的构造函数代码被赋予delayedInit
方法,但永远不会在任何地方运行,因此App
的对象构造函数永远不会运行。