Erlang,寄存器/2:异常错误错误参数错误
我想写一个创建两个进程的程序。 第一个打印号码,将其发送到第二个进程,依此类推。 但是我在启动功能上有问题Erlang,寄存器/2:异常错误错误参数错误,erlang,Erlang,我想写一个创建两个进程的程序。 第一个打印号码,将其发送到第二个进程,依此类推。 但是我在启动功能上有问题 -module(zad). -export([start/0, one/0, two/0]). one() -> receive {go1, N} -> io:format("1 ~w~n", [N]), two ! {go2, N+1}, one(); {go2
-module(zad).
-export([start/0, one/0, two/0]).
one() ->
receive
{go1, N} ->
io:format("1 ~w~n", [N]),
two ! {go2, N+1},
one();
{go2, 50} ->
io:format("END ~w~n", [N+1]),
two ! finished
end.
two() ->
receive
finished ->
io:format("two finished~n", []);
{go2, N} ->
io:format("2 ~w~n", [N]),
one ! {go1, N+1 },
two()
end.
start() ->
register(two, spawn(zad, two, [])),
register(one, spawn(zad, one, [])),
one ! {go1, 0}.
这是错误
** exception error: bad argument
in function register/2
called as register(two,<0.146.0>)
in call from zad:start/0 (zad.erl, line 29)
到
错误消失了。
这真的很奇怪,因为问题出在
one()
,而错误出在寄存器(二)
您可以在start/0
中注册两个进程。这意味着传递到寄存器/2
的值是错误的。从文档()中:
失败:
如果PidOrPort不是现有的本地进程或端口badarg
如果RegName已在使用badarg
如果进程或端口已经注册(已经有名称)badarg
如果RegName是atombadarg
未定义的
很可能发生的情况是,在调用
register/2
之前,进程已死亡(请参阅上面列表中的第一个失败)。您可以在start/0
中注册两个进程。这意味着传递到寄存器/2
的值是错误的。从文档()中:
失败:
如果PidOrPort不是现有的本地进程或端口badarg
如果RegName已在使用badarg
如果进程或端口已经注册(已经有名称)badarg
如果RegName是atombadarg
未定义的
很可能是在调用
register/2
之前进程就死了(请参见上面列表中的第一个失败)。可能two/0
中也有语法错误?也许two/0
中的一个更改没有被编译,当您为one/0
重新编译时,它被更正了?您尝试运行了多少次?如果第二次运行时未注销名称,则在尝试重新注册名称时会出现错误,因为该名称已在使用中。可能在two/0
中也存在语法错误?也许two/0
中的一个更改没有被编译,当您为one/0
重新编译时,它被更正了?您尝试运行了多少次?如果第二次运行时未注销名称,则在尝试重新注册名称时会出现错误,因为该名称已在使用中。
{go2, 50} -> io:format("END ~w~n", [N+1]),
{go2, 50} -> io:format("END ~w~n", [50]),