了解DelayedInit

Kev*_*ith 7 scala

DelayedInitScala深度看 ...

评论是我对代码的理解.

以下特征接受单个参数,该参数是非严格评估的(由于=>),并返回Unit.它的行为类似于构造函数.

trait DelayedInit {
  def delayedInit(x: => Unit): Unit
}
Run Code Online (Sandbox Code Playgroud)

据我所知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(_())
}
Run Code Online (Sandbox Code Playgroud)

然后,按照本书的例子,我去了REPL:

scala> val x = new App { println("Now I'm initialized") }
x: java.lang.Object with App = $anon$1@2013b9fb
Run Code Online (Sandbox Code Playgroud)

我看到......的输出

scala> x.main(Array())

没有什么.

构造App实例是否应该导致调用,delayedInit以便x.main(Array())返回类似构造函数的行为?或者,更具体地说,应该Now I'm initialized预计会打印出来吗?

Mau*_*res 7

我猜你DelayedInit在同一个文件中定义了自己的特征App.如果你这样做,删除它,DelayedInitscala包内的特征.

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

编辑

会发生的事情是,在使用新的应用程序创建的匿名App对象的构造函数之前调用delayedInit中的代码{println("现在我已初始化")}.你可以在这个截图中看到它:

显示正在执行的代码的工作表

如果您决定删除此行:

x = Some(() => cons)
Run Code Online (Sandbox Code Playgroud)

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