Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 将正在构造的实例传递给案例类构造函数_Scala - Fatal编程技术网

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

Scala 将正在构造的实例传递给案例类构造函数,scala,Scala,我有一组复杂的特征和案例类,但为了便于讨论,让我总结一下我试图以这种方式建模的内容: case class X(x: X) val myX: X = X(myX) 这很好,直到我以这种方式初始化其中一个实例: case class X(x: X) val myX: X = X(myX) 它可以编译(令人难以置信),但是传递给构造函数的myX实际上是空的,通过事后检查myX.x很容易看到 假设有一个指向自身的实例对于我试图建模的对象来说是很好的,那么有没有一种优雅的方法来解决这个问题,并使

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

case class X(x: X)
val myX: X = X(myX)
这很好,直到我以这种方式初始化其中一个实例:

case class X(x: X)
val myX: X = X(myX)
它可以编译(令人难以置信),但是传递给构造函数的
myX
实际上是空的,通过事后检查
myX.x
很容易看到

假设有一个指向自身的实例对于我试图建模的对象来说是很好的,那么有没有一种优雅的方法来解决这个问题,并使新的
X
实例具有指向自身的指针?我的意思是,在创建对象之后,不需要对其进行变异,也不需要引入第二个构造函数,该构造函数不接受任何参数,并且在内部使用
this
。请记住,实际情况更复杂,在这里草拟。

不明智地考虑在“类< /P>”类类中使用名称参数“模拟”。

case class X(v: () => X) {
  def x: X = v.apply
}

val myX: X = X(() => myX)

但是请注意Jasper-M的警告。

如果您需要一个case类,我认为这是不可能的。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

如果您想要类似case类的行为,您必须自己实现样板文件(apply、unapply、copy、equals、hashcode等),并且非常小心不要触发无限循环或堆栈溢出。

可能需要一些延迟VAL和延迟参数计算的技巧……您到底想建模什么?因为如果它是一个无限的数据类型,那么它必须是惰性的。如果它是有限的,那么您需要一种方法来表示结束,就像一个空元素一样。它可能有助于检查列表和LayzList是如何定义的。除了检查FP.Wait的修复概念外,您还说您想自己传递给构造函数?为什么?这实际上是不可能的,通常您不需要它,您可以使用
this
。我想为相互指向的对象建模。出于合理的原因,对象可能指向自身。在不可变实例的情况下,如何初始化该实例?如果指针总是在一个或两个对象之间并且是双向的,那么我建议您考虑将指针部分移到另一个类中,该类作为链式对象接收参数。但是请注意,您将失去case类的大部分好处,因为
X(()=>myX)==X(()=>myX)
将为false。