向Erlang中的进程广播消息时出错
我是Erlang的新手,我正在尝试让一个Pid向其他几个Pid发送消息 我有一个函数,它以Pid、字符串(消息)和整数R(半径)作为参数 当我调用函数broadcast时,我收到以下消息:向Erlang中的进程广播消息时出错,erlang,erlang-shell,Erlang,Erlang Shell,我是Erlang的新手,我正在尝试让一个Pid向其他几个Pid发送消息 我有一个函数,它以Pid、字符串(消息)和整数R(半径)作为参数 当我调用函数broadcast时,我收到以下消息: faceinsok:broadcast(Pid, "asd", 1). ** exception error: bad argument in function faceinsok:'-broadcast/3-lc$^0/1-0-'/5 (faceinso
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],
[F!{broadcast,P,M,R},Friends}| F再次。在第55行中,您将接收到
{P,Friends}
,并假设Friends
是一个列表。但我猜不是。因为在第53行中,您正在发送{self(),Friends}
,并且您无法在atomFriends
上进行列表编译
如果Friends
实际上是一个列表,则应该添加守卫检查
receive
{P, Friends} when is_list(Friends) ->
[F ! {{broadcast, P, M, R}, Friends} || F <- Friends],
ok;
{} ->
接收
{P,Friends}什么时候是_列表(Friends)->
[F!{广播,P,M,R},朋友}| F
然后检查它是否按您认为的方式工作。可能重复“改进”代码不同的错误消息,因此我不认为它可以被视为重复。您没有广播问题,您有模式匹配/类型问题。实际上,朋友
始终是一个列表。在第53行,我发送了一条消息,其中“string”friends和looper收到它并发回列表friends
。我这样做不对吗?:/You认为它是一个列表(Pid的),或者它应该是一个列表。试着在第56行之前打印它,看看它是什么,就像在最简单的调试中一样。它应该是一个{Pid,string}的列表。也许我没有进行正确的模式匹配?你所说的字符串是什么意思?请检查变量的实际值,这是最简单的方法。@mpm:问题当然出在Friends
,它不是一个列表,但是Friends
是一个原子这一事实与它无关。除了你的r埃普利是正确的。
[F ! {{broadcast, P, M, R}, Friends} || F <- Friends],
receive
{P, Friends} when is_list(Friends) ->
[F ! {{broadcast, P, M, R}, Friends} || F <- Friends],
ok;
{} ->