无法在接收块中使用Erlang/ets

Din*_*esh 5 erlang

我正在尝试使用Erlang/ets通过模式匹配接收数据来存储/更新各种信息.这是代码

start() -> 
    S = ets:new(test,[]),
    register(proc,spawn(fun() -> receive_data(S) end)).

receive_data(S) ->
    receive
        {see,A} -> ets:insert(S,{cycle,A}) ;
        [[f,c],Fcd,Fca,_,_] -> ets:insert(S,{flag_c,Fcd,Fca});
        [[b],Bd,Ba,_,_] -> ets:insert(S,{ball,Bd,Ba})



    end,
    receive_data(S).
Run Code Online (Sandbox Code Playgroud)

这里A是循环数,[f,c]是中心标志,[b]是球和Fcd,Fca,Bd,Ba是来自玩家的标志和球的方向和角度.

发件人进程正在发送这些信息.这里,模式匹配正常工作,我通过打印A,Fcd,Fca ...等的值来检查.我相信使用Erlang/ets有问题.

当我运行此代码时,我得到这样的错误

Error in process <0.48.0> with exit value: {badarg,[{ets,insert,[16400,{cycle,7}]},{single,receive_data,1}]
Run Code Online (Sandbox Code Playgroud)

谁能告诉我这段代码有什么问题以及如何解决这个问题?

D.N*_*bon 8

问题是ets-table的所有者是运行该start/1函数的进程,而ets的默认行为是只允许所有者写入和其他进程读取,也就是受保护.两种解决方案

  1. 将ets表创建为public

    S = ets:new(test,[public]). 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将所有者设置为新创建的进程

    Pid = spawn(fun() -> receive_data(S) end, 
    ets:give_away(test, Pid, gift)
    register(proc,Pid)
    
    Run Code Online (Sandbox Code Playgroud)

give_away/3的文档