我在看 DelayedInit
在 Scala in Depth ...
注释是我对代码的理解。
下面的 trait 接受一个非严格计算的参数(由于 =>
),并返回 Unit
.它的行为类似于构造函数。
trait DelayedInit {
def delayedInit(x: => Unit): Unit
}
据我了解
App
,此特征具有
var x
等于 0 元的函数(无参数)。
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
trait 与 App
位于同一文件中.如果你这样做了,删除它,DelayedInit
是 scala
中的一个特征包裹。
我刚刚从书中获取了代码并直接粘贴到 Eclipse 工作表中,它就可以工作了。
编辑
发生的情况是,在您使用 new App { println("Now I'm initialized") } 创建的匿名 App 对象的构造函数之前,delayInit 中的代码被调用。您可以在此屏幕截图中看到它:
如果您决定删除此行:
x = Some(() => cons)
你会看到 现在我已经初始化 从不打印。因为匿名的构造函数代码
App
您正在创建的对象被赋予
delayedInit
方法但永远不会在任何地方运行,所以
App
的对象构造函数永远不会运行。