Вопрос

Модуль орграфов Эрланга удивил меня изменением состояния.

При работе с другими модулями структуры данных в Erlang, например с модулем set, экземпляр переданной структуры данных не изменяется.Функция возвращает новую, измененную версию, например.

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

Это не поведение при работе с модулем орграфа.

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

Во-первых, почему библиотека орграфов в этом отношении отличается?

Во-вторых, что более важно, как модуль digraph добавляет новое состояние к существующей привязке?

Я предполагаю, что состояние хранится в другом процессе, который модуль digraph идентифицирует, используя существующую и неизмененную привязку G.Так ли это?Или существуют ли другие способы изменения состояния, связанного с привязкой?

Это было полезно?

Решение

  1. Наверное, для эффективности
  2. Он использует ETS для хранения орграфа.Возвращаемое значение из new на самом деле является ссылкой на таблицы ets.

Запустите панель инструментов: start().из оболочки erlang и откройте приложение визуализатора таблиц — вы увидите набор таблиц ets для утилиты digraph.

edges
vertices
neighbours

Значения в возвращаемом значении вызова digraph:new — это идентификаторы таблиц ets этих таблиц...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top