我正在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])。如果xNone,那么将不会发生任何事情。
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特性。如果这样做,请将其删除,DelayedInitscala包内的一个特征。

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

编辑

发生的事情是,delayedInit内部的代码在使用新App {println(“Now I'm initialized”)创建的匿名App对象的构造函数之前被调用。您可以在以下屏幕截图中看到它:

如果您决定删除此行:

x = Some(() => cons)

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

关于scala - 了解DelayedInit,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20649982/

10-10 22:35