自我参考价值

时间:2012-06-30 10:12:43

标签: scala

我遇到了值初始化问题:

class Top 

class X(val v : Top) extends Top 
class Y extends Top 

X是使用其他Top类型对象(例如X或Y)构造的类。这意味着它可以使用自身构造。例如,

val x = new X(x) 

编译器可以工作,但是当我访问v字段时,我返回null。

scala> x.v 
res9: Top = null 

我尝试了延迟初始化和按名称参数,得到了相同的结果。我的Scala版本是2.9.1。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:5)

隆,

你的代码如何使用lazy和call-by-name看起来像?它对我有用:

class Top
class X(_v: => Top) extends Top {
  lazy val v = _v
}

scala> lazy val x: X = new X(x)
x: X = <lazy>

scala> x.v
res3: Top = X@422d15ad

答案 1 :(得分:0)

这确实很不幸,也发生在Scala 2.9.2中;但是你需要在那里添加类型,所以它是val x: X = new X(x)。我认为编译器应该明确拒绝这一点,因为它不能通过急切的参数v成功。

我不知道您的具体情况是什么,但它似乎是一种数据结构。也许像下面这样的方法适合你

trait Top
trait X extends Top { def v: Top }

object TopLoop extends X { def v: Top = this }
class Y( x: X ) extends Top { def v: Top = x }

如果您想使用模式匹配,您还可以将sealed添加到特征中,并将case添加到对象和类中。