7

Erlang digraphs 模块通过改变状态让我感到惊讶。

在处理 Erlang 中的其他数据结构模块时,例如 sets 模块,传入的数据结构的实例是未修改的。该函数返回一个新的更改版本,例如

>S = sets:new().
>sets:size(S).
0
>T = sets:add_element(S, "element").
>sets:size(S).
0
>sets:size(T).
1

这不是处理 digraph 模块时的行为。

>G = digraph:new().
>digraph:no_vertices(G).
0
>digraph:add_vertex(G, "vertex").
>digraph:no_vertices(G).
1

首先,为什么有向图库在这方面有所不同?

其次,更重要的是,有向图模块如何针对现有绑定添加新状态?

我假设状态被存储在另一个进程中,digraph 模块正在使用现有且未更改的绑定 G 进行标识。是这种情况吗?或者还有其他修改与绑定相关的状态的方法吗?

4

1 回答 1

9
  1. 可能是为了效率
  2. 它使用 ETS 来存储有向图。new 的返回值实际上是对 ets 表的引用。

运行工具栏:start()。从您的 erlang shell 中打开表可视化应用程序 - 您将看到一组用于 digraph 实用程序的 ets 表。

edges
vertices
neighbours

digraph:new 调用的返回值中的值是这些表的 ets 表 id...

于 2009-09-03T23:21:53.307 回答