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

scala – 如何从子类型中的trait初始化值?

发布时间:2020-12-16 08:50:52 所属栏目:安全 来源:网络整理
导读:如果我写: trait T { val t = 3 val u = 1::t::Nil}class U extends T { override val t = 2}(new U).u 它显示了这一点. List(1,0) 我应该如何更改上面的代码,使其显示以下内容: List(1,2) 即覆盖val t为特征T中的u设置t的值? 解决方法 一种方法是使用def
如果我写:

trait T {
  val t = 3
  val u = 1::t::Nil
}

class U extends T {
  override val t = 2
}

(new U).u

它显示了这一点.

List(1,0)

我应该如何更改上面的代码,使其显示以下内容:

List(1,2)

即覆盖val t为特征T中的u设置t的值?

解决方法

一种方法是使用def或lazy val延迟对u的评估,如下所示:

trait T {
  def t = 3
  def u = 1::t::Nil
}

class U extends T {
  override def t = 2
}

(new U).u

要么

trait T {
  val t = 3
  lazy val u = 1::t::Nil
}

class U extends T {
  override val t = 2
}

(new U).u

差异如下:

> val在初始化期间进行表达式求值> def会在每次使用u时进行表达式计算> lazy val使其在首次使用时进行评估并缓存结果

(编辑:李大同)

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

    推荐文章
      热点阅读