ets:foldl
短いバージョン:すべてのETSレコードを繰り返し処理するときに、それらを削除するために使用しても安全ですか?
ETSテーブルが情報を蓄積していて、それをすべて処理するときが来たとします。レコードがテーブルから読み取られ、何らかの方法で使用されてから削除されます。(また、テーブルがであると仮定すると、private
並行性の問題は発生しません。)
別の言語では、同様のデータ構造で、for ... eachループを使用して、すべてのレコードを処理してから、hash / dict / map/whateverから削除することができます。ただし、ets
モジュールにはforeach
、たとえばのようにはありませんlists
。
しかし、これはうまくいくかもしれません:
1> ets:new(ex, [named_table]).
ex
2> ets:insert(ex, {alice, "high"}).
true
3> ets:insert(ex, {bob, "medium"}).
true
4> ets:insert(ex, {charlie, "low"}).
true
5> ets:foldl(fun({Name, Adjective}, DontCare) ->
io:format("~p has a ~p opinion of you~n", [Name, Adjective]),
ets:delete(ex, Name),
DontCare
end, notused, ex).
bob has a "medium" opinion of you
alice has a "high" opinion of you
charlie has a "low" opinion of you
notused
6> ets:info(ex).
[...
{size,0},
...]
7> ets:lookup(ex, bob).
[]
これは好ましいアプローチですか?少なくとも正しく、バグはありませんか?
処理中にデータ構造を変更することについて一般的な懸念がありますが、ets:foldlのドキュメントは、ETSが内部のレコードの変更に非常に慣れていることを示していますfoldl
。私は基本的にテーブルをきれいに拭いているので、確実にしたいと思います。
私はset
テーブルでErlangR14Bを使用していますが、Erlangバージョン、またはテーブルのタイプにも注意点があるかどうかを知りたいです。ありがとう!