首页 > 解决方案 > 如何在结构中实现递归包含关系?

问题描述

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

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
}

是的,我们陷入了无限循环。我们永远无法得到一个包含彼此的合理结构数据。

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

标签: elixir

解决方案


由于所有术语都是不可变的,就像在中一样,这是不可能的。

我还有这个需求

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

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


推荐阅读