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

Scala注册mixin构造函数的结果是不可改变的

发布时间:2020-12-16 18:35:19 所属栏目:安全 来源:网络整理
导读:我想以编程方式将mixins中发送的值绑定到一个实例,我想知道是否有一个更不可变的方法来执行此操作然后使用隐藏的可变对象.主要是我想将它用于注册表.我目前的方法在施工后并非严格不变,有什么建议吗? trait Numbers { lazy val values = holding private va
我想以编程方式将mixins中发送的值绑定到一个实例,我想知道是否有一个更不可变的方法来执行此操作然后使用隐藏的可变对象.主要是我想将它用于注册表.我目前的方法在施工后并非严格不变,有什么建议吗?

trait Numbers {
  lazy val values = holding
  private var holding = Set.empty[Int]
  protected def includes(i:Int) {
    holding += i
  }
}

trait Odd extends Numbers{
  includes(1)
  includes(3)
  includes(5)
  includes(7)
  includes(9)
}

trait Even extends Numbers {
  includes(2)
  includes(4)
  includes(6)
  includes(8)
}

这给出了我想要的结果

val n = new Odd with Even
println(n.values)

Set(5,1,6,9,2,7,3,8,4)

解决方法

方法覆盖怎么样?然后,您可以在特征线性化中引用“超级”对象,

trait Numbers {
  def holding = Vector[Int]()
  lazy val values = holding
}

trait Odd extends Numbers {
  override def holding = super.holding ++ Vector(1,5)
}

trait Even extends Numbers {
  override def holding = super.holding ++ Vector(0,4)
}

(new Odd with Even).values // Vector(1,5,4)
(new Even with Odd).values // Vector(0,4,5)

(编辑:李大同)

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

    推荐文章
      热点阅读