如何从子类型中的特征初始化值? [英] How to initialize the value from trait in subtype?

查看:27
本文介绍了如何从子类型中的特征初始化值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我写:

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

class U extends T {
  override val t = 2
}

(new U).u

它显示了这一点.

List(1, 0)

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

How should I change the above code to make it display the following:

List(1, 2)

override val t 在特征T?

推荐答案

一种方法是使用 deflazy 延迟对 u 的评估val 如下:

One way to do this is to delay evaluation of u by using def or lazy val as follows:

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 使其在第一次使用 u 时进行评估并缓存结果
  • val makes an expression evaluate during initialization
  • def makes an expression evaluate each time u is used
  • lazy val makes it evaluated on first u usage and caches the result

这篇关于如何从子类型中的特征初始化值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆