如何在结构中实现递归包含关系?

How to implement recursive inclusion relationship in a struct?

定义一个将包含自己的类型结构数据的简单结构:

defmodule MyNode do
  defstruct [:parent, :child]
end

创建父子节点:

iex> p = %MyNode{}
%MyNode{child: nil, parent: nil}
iex> c = %MyNode{parent: p}
%MyNode{child: nil, parent: %MyNode{child: nil, parent: nil}}

在父节点中分配子节点:

iex> p = %{ p | child: c } 
%MyNode{
  child: %MyNode{child: nil, parent: %MyNode{child: nil, parent: nil}},
  parent: nil
}

是的,我们陷入了无限循环。我们永远得不到合理结构的相互包含的数据。

我明白这一切的原因。但是我还有这个需求,代码应该怎么设计?

由于所有术语都是不可变的,如 ,这是不可能的。

I still have this need

这不太可能;设计可能会被改变,使这不是必要的:毕竟,现有的解决方案以不同的方式克服了这一点,让两个对象相互交叉引用是多余的。如果您分享了您的特定问题的更多详细信息,我们可以建议更好的替代方案。

你可以做什么,你可以 运行 一个进程(例如 Agent)备份每个 MyNode 并更新内部状态。或者,您可以将整个 list/graph 保留在 Agent 中,通过此过程为 get_parent/1/get_child/1 提供访问器,查找相应的节点。