了解DelayedInit

时间:2013-12-18 05:00:44

标签: scala

我正在查看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。如果Nonetrait 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}}打印出来?

1 个答案:

答案 0 :(得分:7)

我猜你在与DelayedInit相同的文件中定义了自己的App特征。如果您这样做,请将其删除,DelayedInitscala包中的特征。

我刚刚从书中获得了代码并粘贴到Eclipse工作表中,它就可以正常工作了。

修改

当使用新的应用程序{println(“现在我已经初始化”)}创建的匿名App对象的构造函数之前,才会调用delayedInit中的代码。您可以在此屏幕截图中看到它:

Worksheet showing the code being executed

如果您决定删除此行:

x = Some(() => cons)

您将看到现在我已初始化从未打印过。因为您正在创建的匿名App对象的构造函数代码被赋予delayedInit方法,但永远不会在任何地方运行,因此App的对象构造函数永远不会运行。