将正在构造的实例传递给案例类构造函数

rag*_*ojp 0 scala

我有一组复杂的特征和案例类,但为了讨论起见,让我总结一下我试图以这种方式建模的内容:

case class X(x: X)
Run Code Online (Sandbox Code Playgroud)

这很好,直到我最终以这种方式初始化其中一个实例:

val myX: X = X(myX)
Run Code Online (Sandbox Code Playgroud)

它编译(令人难以置信),但myX传递给构造函数的实际上是null,通过myX.x事后检查很容易看到。

假设有一个指向自身的实例对于我要建模的内容来说很好,是否有一种优雅的方法来解决这个问题并让新实例X指向自身?我的意思是没有在创建后改变对象,也没有引入不带参数并this在内部使用的第二个构造函数。请记住,实际情况比这里描述的要复杂。

Jas*_*r-M 6

如果你需要一个案例类,我认为它不能完成。Case 类不能有惰性参数,如果它们可以指向自己,那么它们的大部分方法可能会炸毁堆栈。通过常规课程,您可以这样做:

scala> class X(x0: =>X) {
     |   lazy val x = x0 
     | }
class X

scala> val x: X = new X(x)
val x: X = X@5f98cb6f

scala> x.x
val res0: X = X@5f98cb6f

scala> x.x.x
val res1: X = X@5f98cb6f
Run Code Online (Sandbox Code Playgroud)

如果您想要类似案例类的行为,您必须自己实现样板(应用、取消应用、复制、等于、哈希码等),并且要非常小心,不要触发无限循环或堆栈溢出。