Хранить список в Erlang ETS
Я пытаюсь вставить список в ETS, чтобы вытащить его позже, и по какой-то причине он говорит, что это плохой arg. Я не уверен, что вставляю его неправильно.
Неужели просто невозможно вставить список в ETS?
Оскорбительная строка - ets:insert(table, [{parsed_file, UUIDs}])
.
Вот код:
readUUID(Id, Props) ->
fun () ->
%%TableBool = proplists:get_value(table_bool, Props, <<"">>),
[{_, Parsed}] = ets:lookup(table, parsed_bool),
case Parsed of
true ->
{uuids, UUIDs} = ets:lookup(table, parsed_bool),
Index = random:uniform(length(UUIDs)),
list_to_binary(lists:nth(Index, UUIDs));
false ->
[{_, Dir}] = ets:lookup(table, config_dir),
File = proplists:get_value(uuid_file, Props, <<"">>),
UUIDs = parse_file(filename:join([Dir, "config", File])),
ets:insert(table, [{parsed_file, {uuids, UUIDs}}]),
ets:insert(table, [{parsed_bool, true}]),
Index = random:uniform(length(UUIDs)),
list_to_binary(lists:nth(Index, UUIDs))
end
end.
parse_file(File) ->
{ok, Data} = file:read_file(File),
parse(Data, []).
parse([], Done) ->
lists:reverse(Done);
parse(Data, Done) ->
{Line, Rest} = case re:split(Data, "n", [{return, list}, {parts, 2}]) of
[L,R] -> {L,R};
[L] -> {L,[]}
end,
parse(Rest, [Line|Done]).
2 ответа:
Если вы создадите таблицу в том же proc с чем-то вроде
ets:new(table, [set, named_table, public]).
Тогда все должно быть в порядке. Разрешения по умолчанию защищены, где только процесс создания может писать.
Как продолжение моего комментария о таблицах ets, содержащих только кортежи, и что
ets:lookup/2
возвращает следующую строку в вашем коде:{uuids, UUIDs} = ets:lookup(table, parsed_bool),
Всегда будет генерировать ошибку , так как
ets:lookup/2
возвращает список. Вызов 3 строки выше может быть успешным. Похоже, что вы пытаетесь сделать 2 поиска вtable
с ключомparsed_bool
и ожидаете получить 2 различных типа ответов:{_, Parsed}
и{uuids, UUIDs}
. Помните, что ETS предоставляет не таблицы ключ-значение, а таблицы кортежей, где один из элементов, по умолчанию во-первых, это ключ и doingets:lookup/2
возвращает список кортежей с этим ключом. Сколько вы можете получить обратно, зависит от свойств таблицы.Ознакомьтесь с документациейтаблиц ETS .