gpt4 book ai didi

scala - 了解 DelayedInit

转载 作者:行者123 更新时间:2023-12-04 11:53:11 26 4
gpt4 key购买 nike

我在看 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 中的代码被调用。您可以在此屏幕截图中看到它:

Worksheet showing the code being executed

如果您决定删除此行:

x = Some(() => cons)

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com