質問
Erlang の digraphs モジュールの状態の変化には驚きました。
Erlang で他のデータ構造モジュールを扱う場合、たとえば渡されるデータ構造のインスタンスである set モジュールは変更されません。この関数は、変更された新しいバージョンを返します。
>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 を使用して識別している別のプロセスに保存されていると仮定します。これは事実でしょうか?それとも、バインディングに関連付けられた状態を変更する他の方法はありますか?
解決
- おそらく効率化のためでしょう
- ETS を使用して有向グラフを保存しています。new からの戻り値は、実際には ets テーブルへの参照です。
ツールバー:start() を実行します。erlang シェルからテーブル ビジュアライザー アプリケーションを開くと、digraph ユーティリティ用の ets テーブルのセットが表示されます。
edges
vertices
neighbours
digraph:new 呼び出しからの戻り値の値は、これらのテーブルの ets テーブル ID です。
所属していません StackOverflow