在 Erlang ETS 中存储列表



我正在尝试将列表插入 ETS 以便稍后拉出,出于某种原因,它说这是一个糟糕的参数。我不确定我是否插入不正确。

只是无法在 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]).

如果您在同一进程中使用类似

ets:new(table, [set, named_table, public]).

那你应该没事了。默认权限受保护,只有创建进程才能写入。

作为我对仅包含元组的 ets 表的评论以及ets:lookup/2在您的代码中返回以下行的评论的后续:

        {uuids, UUIDs} = ets:lookup(table, parsed_bool),

将始终生成错误,因为ets:lookup/2返回一个列表。上面的 3 行调用可能会成功。似乎您正在尝试使用关键parsed_booltable中进行 2 次查找,并期望获得 2 种不同类型的答案:{_, Parsed}{uuids, UUIDs} 。请记住,ETS 不提供键值表,而是元组表,其中其中一个元素(默认为第一个元素(是键,并且执行ets:lookup/2返回具有该键的元组列表。您可以返回多少取决于表的属性。

查看 ETS 表的文档。

相关内容

  • 没有找到相关文章

最新更新