【问题标题】:Error in broadcasting a message to processes in Erlang在 Erlang 中向进程广播消息时出错
【发布时间】:2014-10-05 23:09:50
【问题描述】:

我是 Erlang 新手,我正在尝试让 Pid 向其他几个 Pid 发送消息。

我有一个函数,它接受一个 Pid、一个字符串(消息)和一个整数 R(半径)作为参数。

broadcast(P, M, R) ->
  P ! {self(), friends},
  receive
    {P, Friends} ->
      [F ! {{broadcast, P, M, R}, Friends} || F <- Friends],
      ok;
    {} ->
  end.

我有这个等待接收新消息的监听函数:

looper({Name, Friends, Messages}) ->
  receive
    {From, friends} ->
       From ! {self(), Friends},
       looper({Name, Friends, Messages});
    {{broadcast, ID, M, R}, Friends}  ->
       % From ! {From, {self(), {ID, M}}},
       looper({Name, Friends, [{ID, M} | Messages]});
    terminate ->
      ok
  end.

当我调用函数广播时,我收到以下消息:

faceinsok:broadcast(Pid, "asd", 1).                     
** exception error: bad argument
     in function  faceinsok:'-broadcast/3-lc$^0/1-0-'/5 (faceinsok.erl, line 56)

第 56 行是:

[F ! {{broadcast, P, M, R}, Friends} || F <- Friends],

据我了解,我没有正确传递消息:/ 我做错了什么?

【问题讨论】:

标签: erlang erlang-shell


【解决方案1】:

再次。在第 55 行,您收到 {P, Friends},并假设 Friends 是一个列表。但我想不是,因为在第 53 行你发送的是{self(), friends}。而且你不能在原子friends上做列表综合。

如果Friends 实际上是一个列表,您应该添加保护检查。

  receive
    {P, Friends} when is_list(Friends) ->
      [F ! {{broadcast, P, M, R}, Friends} || F <- Friends],
      ok;
    {} ->

然后检查它是否按照您认为的方式工作。

【讨论】:

  • 其实Friends总是一个列表。在第 53 行中,我向“字符串”朋友发送了一条消息,looper 接收到该消息并发回列表Friends。我这样做不对吗? ://
  • 你认为它是一个(Pid 的)列表,或者它应该是一个列表。尝试在第 56 行之前打印它,看看它是什么,就像在最简单的调试中一样。
  • 应该是 {Pid, String} 的列表。也许我没有进行正确的模式匹配?
  • String 是什么意思?请检查变量的实际值是什么,这是最简单的方法。
  • @mpm:问题当然出在Friends,这不是一个列表,但friends是一个原子这个事实与它无关。除此之外,您的回复是正确的。
猜你喜欢
  • 2014-11-29
  • 1970-01-01
  • 2014-11-29
  • 2019-10-26
  • 1970-01-01
  • 2016-12-02
  • 2013-09-09
  • 1970-01-01
  • 2020-11-23
相关资源
最近更新 更多