IT干货网

scala之了解 DelayedInit

freeliver54 2024年11月01日 编程设计 5 0

我在看 DelayedInitScala in Depth ...

注释是我对代码的理解。

下面的 trait 接受一个非严格计算的参数(由于 => ),并返回 Unit .它的行为类似于构造函数。

trait DelayedInit { 
  def delayedInit(x: => Unit): Unit 
} 

据我了解 App ,此特征具有 var x等于 0 元的函数(无参数)。 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 trait 与 App 位于同一文件中.如果你这样做了,删除它,DelayedInitscala 中的一个特征包裹。

我刚刚从书中获取了代码并直接粘贴到 Eclipse 工作表中,它就可以工作了。

编辑

发生的情况是,在您使用 new App { println("Now I'm initialized") } 创建的匿名 App 对象的构造函数之前,delayInit 中的代码被调用。您可以在此屏幕截图中看到它:



如果您决定删除此行:

x = Some(() => cons) 

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


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!