我不确定你的担心。有向图存储在 ETS 中的事实在用户界面中是透明的,因此您可能希望更改这一点,以便与另一个进程交换有向图、制作副本或永久存储以防崩溃。
对于前两个主题,很容易在元组中检索有向图的定义,{Cyclic,Protect,[Vertice],[edge]}
然后交换它:
digraph_To_Tuple(Di) ->
Opt = digraph:info(Di),
Vs = [digraph:vertex(Di,X) || X <- digraph:vertices(Di)],
Es = [digraph:edge(Di,X) || X <- digraph:edges(Di)],
{proplists:get_value(cyclicity,Opt),proplists:get_value(protection,Opt),Vs,Es}.
clone (Di) ->
{Cyclic,Protect,Vs,Es} = digraph_To_Tuple(Di),
Do = digraph:new([Cyclic,Protect]),
[digraph:add_vertex(Do,V,N) || {V,N} <- Vs ],
[digraph:add_edge(Do,E,S,D,N) || {E,S,D,N} <- Es],
Do.
最后一个主题是一个真正的问题,因为一旦创建它的进程死亡,一个 ets 就会被销毁。有一些方法可以将所有权转让给其他进程,但在这种情况下,与 ets 实现的独立性就会丢失。更好的可能性是在一个进程中创建有向图并将其传递给其他负责操作它们的进程。
但我不认为在不重写部分或整个模块的情况下拥有另一种类型的存储有任何意义。