Состояние в орграфах Эрланга
-
21-09-2019 - |
Вопрос
Модуль орграфов Эрланга удивил меня изменением состояния.
При работе с другими модулями структуры данных в 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.Так ли это?Или существуют ли другие способы изменения состояния, связанного с привязкой?
Решение
- Наверное, для эффективности
- Он использует ETS для хранения орграфа.Возвращаемое значение из new на самом деле является ссылкой на таблицы ets.
Запустите панель инструментов: start().из оболочки erlang и откройте приложение визуализатора таблиц — вы увидите набор таблиц ets для утилиты digraph.
edges
vertices
neighbours
Значения в возвращаемом значении вызова digraph:new — это идентификаторы таблиц ets этих таблиц...