加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 了解DelayedInit

发布时间:2020-12-16 18:55:50 所属栏目:安全 来源:网络整理
导读:我在 Scala in Depth看DelayedInit …… 评论是我对代码的理解. 以下特征接受单个参数,该参数是非严格评估的(由于=),并返回Unit.它的行为类似于构造函数. trait DelayedInit { def delayedInit(x: = Unit): Unit} 据我了解App,这个特性的var x等于0-arity(无
我在 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的对象构造函数永远不会运行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读