2009-09-03 4 views
6

Das Erlang-Digraphen-Modul überraschte mich durch einen mutierenden Zustand.Zustand in Erlang Digraphen

Wenn Sie mit anderen Datenstrukturmodulen in Erlang arbeiten, z. B. mit dem Mengenmodul, ist die Instanz der übergebenen Datenstruktur unverändert. Die Funktion gibt eine neue, geänderte Version z.

>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 Digraphenmodul.

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

Erstens, warum ist die Digraph-Bibliothek in dieser Hinsicht anders?

Zweitens, und noch wichtiger, wie fügt das Digraph-Modul einen neuen Zustand gegen eine bestehende Bindung hinzu?

Ich gehe davon aus, dass der Status in einem anderen Prozess gespeichert wird, den das Digraph-Modul mit der vorhandenen und unveränderten Bindung G identifiziert. Ist das der Fall? Oder gibt es andere Möglichkeiten, den Status einer Bindung zu ändern?

Antwort

9
  1. Wahrscheinlich für Effizienz
  2. Es ist mit der ETS die digraph zu speichern. Der Rückgabewert von new sind eigentlich Verweise auf ets-Tabellen.

Symbolleiste ausführen: start(). von Ihrer Erlang-Shell und öffnen Sie die Tabelle Visualizer-Anwendung - Sie sehen eine Reihe von ETS-Tabellen für das Digraph-Dienstprogramm.

edges 
vertices 
neighbours 

Die Werte in dem Rückgabewert des Digraph: neuer Aufruf sind das ets Tabelle-IDs dieser Tabellen ...

+0

Danke, ich keine Prozesse finden konnte, die sie sahen aus wie mit Digraphe zu tun haben. Gibt es in Erlang-Modulen Konventionen, die Ihnen mitteilen, dass der Status außerhalb des aktuellen Prozesses gespeichert wird? –

+0

Nein, ich glaube nicht, dass es da ist. Aber als ich den Rückgabewert von digraph: new() sah, sah es bemerkenswert wie ein Verweis auf etwas anderes aus und der übliche Ort, um "etwas anderes" zu speichern, ist ets ... –

+0

Ich erinnere mich, dass in früheren Digraph-Dokumenten ets nur erwähnt wurde in Doc in Beschreibung Teil, aber jetzt ist es nicht. –