scala – 了解DelayedInit
我在
Scala in Depth看DelayedInit ……
评论是我对代码的理解. 以下特征接受单个参数,该参数是非严格评估的(由于=>),并返回Unit.它的行为类似于构造函数. trait DelayedInit { def delayedInit(x: => Unit): Unit } 据我了解App,这个特性的var x等于0-arity(无参数)的函数. x根据对delayedInit方法的调用进行分配. 然后,如果它具有Some(Function0 [Unit])类型,main将在x上调用apply’_()’.如果x为None,则不会发生任何事情. 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 我看到……的输出 阶> x.main(阵列()) 没有什么. 是否应该构造一个App实例导致调用delayedInit,以便x.main(Array())返回类似构造函数的行为?或者,更具体地说,现在我应该初步确定是否已打印出来? 解决方法
我猜你在与App相同的文件中定义了自己的DelayedInit特征.如果你这样做,删除它,DelayedInit是scala包中的特征.
我刚刚从书中获得了代码并粘贴到Eclipse工作表中,它就可以了. 编辑 会发生的事情是,在使用新的应用程序创建的匿名App对象的构造函数之前调用delayedInit中的代码{println(“现在我已初始化”)}.你可以在这个截图中看到它: 如果您决定删除此行: x = Some(() => cons) 您将看到现在我已初始化的内容从未打印过.因为您正在创建的匿名App对象的构造函数代码被赋予delayedInit方法但从不在任何地方运行,因此App的对象构造函数永远不会运行. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |