我试图在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]).
答案 0 :(得分:2)
如果您使用类似
的内容在同一个proc中创建表ets:new(table, [set, named_table, public]).
那时你应该没问题。默认权限受到保护,只有创建进程才能写入。
答案 1 :(得分:1)
关于我对仅包含元组的ets表的评论,以及ets:lookup/2
在代码中返回以下行的注释:
{uuids, UUIDs} = ets:lookup(table, parsed_bool),
将始终生成错误,因为ets:lookup/2
会返回一个列表。上述3行的呼叫可能会成功。您似乎正尝试使用密钥table
在parsed_bool
中进行2次查找,并期望得到2种不同类型的答案:{_, Parsed}
和{uuids, UUIDs}
。请记住,ETS不提供键值表,而是提供元组表,其中一个元素(默认为第一个元素)是键,而ets:lookup/2
返回带有该键的元组列表。你可以取回多少取决于桌子的属性。
查看ETS tables的文档。