2

後で引き出すために 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]).
4

2 に答える 2

2

次のようなものを使用して同じプロシージャでテーブルを作成する場合

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

その後、あなたは大丈夫なはずです。デフォルトの権限は保護されており、作成中のプロセスのみが書き込み可能です。

于 2014-12-19T08:24:17.037 に答える
1

ets:lookup/2タプルのみを含む ets テーブルと、コードで次の行を返すものに関する私のコメントの続きとして:

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

リストをets:lookup/2返すため、常にエラーが発生します。上記の 3 行の呼び出しは成功する可能性があります。tableキーで2 つのルックアップを実行しようとしているようで、parsed_bool2 つの異なるタイプの回答が得られることを期待しています:{_, Parsed}{uuids, UUIDs}. ETS はキーと値のテーブルを提供するのではなく、要素の 1 つ (デフォルトでは最初の要素) がキーであるタプルのテーブルを提供し、ets:lookup/2そのキーを持つタプルのリストを返すことに注意してください。返される数は、テーブルのプロパティによって異なります。

ETS テーブルのドキュメントを参照してください。

于 2014-12-21T16:33:42.223 に答える