2014-11-02 58 views
0

我有一个函数,它将一个值设置为一个进程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}]}]} 

据我了解,我给坏的参数列表:成员函数。 我该怎么办?

感谢

回答

2

如果你读了您的错误信息,你有{lists,member, [<0.888.0>,empty_list] ...,其中lists是模块,member是函数名和[<0.888.0>,empty_list]是aruguments(二)呈现为列表。所以你打电话lists:nenber/2PidList变量是原子empty_list。这给你一个错误。

所以,你需要考虑如何功能可按被称为(者优先),或在PidList

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

感谢创造出一些模式匹配原来我所有:) – sokras 2014-11-02 18:48:14

+0

它发生后调用'empty_list' :)请记住,您可以在'[]'上模式匹配,因此不需要'empty_list'抽象。你可以尝试使用[dialyzer](http://www.erlang.org/doc/apps/dialyzer/dialyzer_chapter.html),这可能会提醒你这种类型错误。 – mpm 2014-11-02 20:33:14

相关问题