如何检查一个Pid是否是Erlang中的Pid列表的成员?
问题描述:
我有一个函数,它将一个值设置为一个进程Pid,我可以让一个进程依赖于另一个进程。所以如果我为进程设置一个值,那么我也必须将值设置为依赖它的进程。但是,如果在进程之间有一个圆圈,那么我想返回一条错误消息。如何检查一个Pid是否是Erlang中的Pid列表的成员?
我尝试通过传递一个已经更改值的Pid列表来完成此操作,以便在两次遇到同一个Pid时(通过检查它是否为Pid列表的成员),然后停止整个函数。这是我的代码:
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}]}]}
据我了解,我给坏的参数列表:成员函数。 我该怎么办?
感谢
答
如果你读了您的错误信息,你有{lists,member, [<0.888.0>,empty_list] ...
,其中lists
是模块,member
是函数名和[<0.888.0>,empty_list]
是aruguments(二)呈现为列表。所以你打电话lists:nenber/2
与PidList
变量是原子empty_list
。这给你一个错误。
所以,你需要考虑如何功能可按被称为(者优先),或在PidList
像
set_values(Pid, Value, PidSet, _PidList = empty_list) ->
...
感谢创造出一些模式匹配原来我所有:) – sokras 2014-11-02 18:48:14
它发生后调用'empty_list' :)请记住,您可以在'[]'上模式匹配,因此不需要'empty_list'抽象。你可以尝试使用[dialyzer](http://www.erlang.org/doc/apps/dialyzer/dialyzer_chapter.html),这可能会提醒你这种类型错误。 – mpm 2014-11-02 20:33:14