使用循环引用

时间:2015-12-23 22:22:42

标签: scala immutability

我想建模一个简单的图形,其中每个节点都连接到另一个节点。

这似乎是给定场景的节点的合理定义:

case class Node(other: Node)

但是我想创建一个如下所示的图表:

   --------------
   |            |
node_a          V
   ^          node_b
   |            |
   --------------

考虑到Node的定义,似乎无法创建这样的图形,因为other是不可变的,需要在创建时分配,但不可能同时创建两个节点。

我想我可以存储另一个节点的名称:

case class Node(name: String, otherName: String)
...
val n1 = Node("a", "b")
val n2 = Node("b", "a")
val nodes = Map(n1.name -> n1, n2.name -> n2)

这需要为每个节点生成唯一标识符的附加步骤。这并不可怕,但我真的很喜欢使用节点本身直接遍历图表的优雅,而不是n.other la nodes.get(n.other)

我在这里寻找不可能的事吗?

1 个答案:

答案 0 :(得分:0)

2011年的这个问题有一个很好的答案,暗示了使用懒惰的黑客行为:Scala: circular references in immutable data types?