如何检查Pid是否是Erlang中Pids列表的成员?

时间:2014-11-02 17:00:28

标签: erlang erlang-shell

我有一个函数为进程Pid设置一个值,我可以让一个进程依赖于另一个进程。因此,如果我为进程设置一个值,那么我还必须将值设置为依赖于它的进程。但是,如果流程之间存在循环

i.e. A depends on B and B depends on A 

然后我想返回一条错误消息。

我尝试通过传递已更改值的Pid列表来执行此操作,以便如果我遇到相同的Pid两次(通过检查它是否是Pids列表的成员),则整个函数停止。这是我的代码:

set_values(Pid, Value, PidSet, PidList) ->
  case lists:member(Pid, PidList) of 
    false -> io:format("Setting Value~n"),
    lists:map(fun(Pid) ->
     Pid ! {self(), set_value, Value, [Pid | PidList]} end, PidSet);
    true -> io:format("circle_detected~n"),
    Pid ! {circle_detected}
  end.

当我运行它时,我收到此错误:

=ERROR REPORT==== 2-Nov-2014::17:47:45 ===
Error in process <0.888.0> with exit value: {badarg,[{lists,member,
[<0.888.0>,empty_list],[]},{process,set_viewer_values,4,[{file,"process.erl"},{line,56}]},
{process,looper,2,[{file,"process.erl"},{line,116}]}]}

根据我的理解,我给列表提供了不好的参数:成员函数。 我该怎么办?

由于

1 个答案:

答案 0 :(得分:2)

如果您阅读了错误消息,则表示{lists,member, [<0.888.0>,empty_list] ...,其中lists是模块,member是函数名称,[<0.888.0>,empty_list]是作为列表显示的结果(两个) 。因此,当lists:nenber/2变量为 atom PidList时,您正在调用empty_list。这会给你一个错误。

所以你需要调查你如何被调用(首选),或者在PidList上创建一些模式匹配

set_values(Pid, Value, PidSet, _PidList = empty_list) ->
   ...