Staat in Erlang-Digraphen
-
21-09-2019 - |
Frage
Das Erlang-Digraphenmodul überraschte mich durch die Zustandsänderung.
Beim Umgang mit anderen Datenstrukturmodulen in Erlang, beispielsweise dem Sets-Modul, bleibt die Instanz der übergebenen Datenstruktur unverändert.Die Funktion gibt eine neue, geänderte Version zurück, z.B.
>S = sets:new().
>sets:size(S).
0
>T = sets:add_element(S, "element").
>sets:size(S).
0
>sets:size(T).
1
Dies ist nicht das Verhalten beim Umgang mit dem Digraph-Modul.
>G = digraph:new().
>digraph:no_vertices(G).
0
>digraph:add_vertex(G, "vertex").
>digraph:no_vertices(G).
1
Erstens: Warum unterscheidet sich die Digraphenbibliothek in dieser Hinsicht?
Zweitens und noch wichtiger: Wie fügt das Digraph-Modul einen neuen Status zu einer vorhandenen Bindung hinzu?
Ich gehe davon aus, dass der Zustand in einem anderen Prozess gespeichert wird, den das Digraph-Modul anhand der vorhandenen und unveränderten Bindung G identifiziert.Ist das der Fall?Oder gibt es andere Möglichkeiten, den mit einer Bindung verbundenen Status zu ändern?
Lösung
- Wahrscheinlich aus Effizienzgründen
- Es verwendet ETS zum Speichern des Digraphen.Der Rückgabewert von new sind eigentlich Verweise auf ets-Tabellen.
Führen Sie toolbar:start() aus.Öffnen Sie in Ihrer Erlang-Shell die Tabellenvisualisierungsanwendung. Sie sehen eine Reihe von ETS-Tabellen für das Digraph-Dienstprogramm.
edges
vertices
neighbours
Die Werte im Rückgabewert des Aufrufs digraph:new sind die ets-Tabellen-IDs dieser Tabellen ...