消息传递时Erlang处理“badarg”错误
我是Erlang新手,尝试通过消息传递将从一个函数获得的结果传递给另一个函数,但我不确定为什么在执行ie main时它会给我badarg错误!{数字,1100}。我试图做一些更改,如灰显部分所示,但在使用From时消息没有传递。这是我的密码: 如果你从main那里得到一个消息!消息,这意味着没有在名称main下注册的进程。它要么没有启动,要么一开始就没有正确注册,要么在某个时候就死了。您可以添加更多的print语句来跟踪发生的情况 您可以使用查看已注册的内容。如果您从main获得一个!消息,这意味着没有在名称main下注册的进程。它要么没有启动,要么一开始就没有正确注册,要么在某个时候就死了。您可以添加更多的print语句来跟踪发生的情况消息传递时Erlang处理“badarg”错误,erlang,Erlang,我是Erlang新手,尝试通过消息传递将从一个函数获得的结果传递给另一个函数,但我不确定为什么在执行ie main时它会给我badarg错误!{数字,1100}。我试图做一些更改,如灰显部分所示,但在使用From时消息没有传递。这是我的密码: 如果你从main那里得到一个消息!消息,这意味着没有在名称main下注册的进程。它要么没有启动,要么一开始就没有正确注册,要么在某个时候就死了。您可以添加更多的print语句来跟踪发生的情况 您可以使用查看已注册的内容。如果您从main获得一个!消息,这
您可以使用查看注册的内容。执行此功能:
start_main() ->
register(main, spawn(numbers, main, [0,2])).
将启动一个名为main的进程,该进程执行函数number:main/2。函数numbers:main/2开始执行后,它进入一个receive子句并等待消息
如果随后执行函数proc/0,它也将输入一个receive子句并等待消息。如果您向运行proc/0的进程发送一条消息,如{work,1,3},那么proc/0将向numbers:main/2发送一条消息,如{return,6};和数字:main/2将显示一些输出。这是证据:
~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3 (abort with ^G)
1> c(numbers).
{ok,numbers}
2> numbers:start_main().
true
3> Pid = spawn(numbers, proc, []).
<0.73.0>
4> Pid ! {work, 1, 3}.
Processing 1 to 3
{work,1,3}
Received 6
5>
正如您所看到的,没有badarg错误。当你声称某事发生时,你需要用证据来证明,仅仅说某事发生是不够的。执行此函数:
start_main() ->
register(main, spawn(numbers, main, [0,2])).
将启动一个名为main的进程,该进程执行函数number:main/2。函数numbers:main/2开始执行后,它进入一个receive子句并等待消息
如果随后执行函数proc/0,它也将输入一个receive子句并等待消息。如果您向运行proc/0的进程发送一条消息,如{work,1,3},那么proc/0将向numbers:main/2发送一条消息,如{return,6};和数字:main/2将显示一些输出。这是证据:
~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3 (abort with ^G)
1> c(numbers).
{ok,numbers}
2> numbers:start_main().
true
3> Pid = spawn(numbers, proc, []).
<0.73.0>
4> Pid ! {work, 1, 3}.
Processing 1 to 3
{work,1,3}
Received 6
5>
正如您所看到的,没有badarg错误。当你声称发生了什么事情时,你需要用证据来证明,仅仅说发生了什么事情是不够的。当你向main发送第一条消息时,它由带有消息{numbers,1100}的receive语句处理,在这个语句中,你产生了两次proc函数,并终止了receive语句 因此,主进程死亡,不再注册,一旦proc函数尝试在main行发送消息!{return,Res},您将得到badarg错误
您需要在mainTotal+Result N-1行递归调用main函数,以保持主进程的活动状态。参见RichardC answer当您将第一条消息发送到main时,它由带有消息{numbers,1100}的receive语句处理,在此语句中生成两次proc函数,并终止receive语句 因此,主进程死亡,不再注册,一旦proc函数尝试在main行发送消息!{return,Res},您将得到badarg错误 您需要在mainTotal+Result N-1行递归调用main函数,以保持主进程的活动状态。参见RichardC的答案