2014-11-02 64 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

相關問題