我是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],
根据我的理解,我没有正确传递消息:/ 我做错了什么?
答案 0 :(得分:1)
再次。在第55行,您收到{P, Friends}
,并假设Friends
是一个列表。但我猜它不是,因为在第53行你发送{self(), friends}
。你不能在原子friends
上列出comphenetion。
如果Friends
实际上是一个列表,您应该添加警卫检查。
receive
{P, Friends} when is_list(Friends) ->
[F ! {{broadcast, P, M, R}, Friends} || F <- Friends],
ok;
{} ->
而不是检查它是否按照你认为的方式工作。