Короткая версия: безопасно ли использовать ets:foldl
для удаления каждой записи ETS, когда вы их просматриваете?
Предположим, что таблица ETS накапливает информацию, и теперь пришло времяобработайте все это.Запись читается из таблицы, используется каким-то образом, а затем удаляется.(Также предположим, что таблица private
, поэтому проблем с параллелизмом нет.)
На другом языке с аналогичной структурой данных вы можете использовать цикл for ... each, обрабатывая каждую запись и затем удаляяэто из хеша / dict / map / что угодно.Однако модуль 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
.Так как я, по сути, вытираю таблицу, хочу быть уверенным.
Я использую Erlang R14B с таблицей set
, однако я хотел бы знать, есть ли какие-либо предостережения с любой версией Erlang,любой тип стола.Спасибо!