【问题标题】:How to check if a Pid is member of a list of Pids in Erlang?如何检查 Pid 是否是 Erlang 中 Pid 列表的成员?
【发布时间】:2014-11-03 01:49:57
【问题描述】:

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

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

那我想返回一个错误信息。

我尝试通过传递一个已经更改值的 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 函数提供了错误的论据。 我该怎么办?

谢谢

【问题讨论】:

    标签: erlang erlang-shell


    【解决方案1】:

    如果您阅读错误消息,您会看到{lists,member, [<0.888.0>,empty_list] ...,其中lists 是模块,member 是函数名,[&lt;0.888.0&gt;,empty_list] 是参数(两个),以列表形式显示。因此,您正在调用lists:nenber/2,其中PidList 变量为atom empty_list。这会给你一个错误。

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

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

    【讨论】:

    • 谢谢,毕竟我打电话给empty_list :)
    • 它发生了 :) 请记住,您可以在 [] 上进行模式匹配,因此不需要 empty_list 抽象。您可以尝试使用dialyzer,它可能会警告您此类类型错误。
    猜你喜欢
    • 2011-03-10
    • 2011-07-09
    • 2011-03-03
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    相关资源
    最近更新 更多