Хранить список в 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 2

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 предоставляет не таблицы ключ-значение, а таблицы кортежей, где один из элементов, по умолчанию во-первых, это ключ и doing ets:lookup/2 возвращает список кортежей с этим ключом. Сколько вы можете получить обратно, зависит от свойств таблицы.

Ознакомьтесь с документациейтаблиц ETS .