-3

我是 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],

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

4

1 回答 1

1

再次。在第 55 行,您正在接收{P, Friends},并假设这Friends是一个列表。但我想不是,因为在第 53 行你正在发送{self(), friends}. 而且你不能在 atom 上列出 Comphenetion friends

您应该添加警卫检查是否Friends实际上是一个列表。

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

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

于 2014-10-05T15:09:50.993 回答