嗨,我正在学习Erlang,在这个过程中,我正在尝试从Erlang execises page进行练习。特别是我正在解决的问题是我必须创建一个函数来创建两个进程,将M个消息发送给另一个然后死掉。我遇到了麻烦,这是我的代码:
-module(roundtrip).
-export([talk/1]).
talk(M) ->
init(M).
init(M) ->
P1 = start(M),
P2 = start(M),
P2 ! {P1, a_message}.
myProc(M) ->
if M =:= 0 ->
io:format("Bye cruel world!~n")
end,
receive
{From, a_message} ->
From ! {self(), a_message},
myProc(M-1);
_ ->
io:format("I don't understand~n"),
myProc(M)
end.
start(M) ->
spawn(?MODULE, myProc, [M]).
当我给谈话打电话时,我得到以下错误:
=错误报告==== 2013年11月11日:: 21:21:00 ===过程中的错误< 0.46.0>退出值:{undef,[{roundtrip,proc,“\ n”,[]}]}
=错误报告==== 2013年11月11日:: 21:21:00 ===过程中的错误< 0.47.0>退出值:{undef,[{roundtrip,proc,“\ n”,[]}]}
我正在解决它,但我无法弄清楚问题是什么......
感谢。
答案 0 :(得分:3)
您需要导出myProc/1
功能。或者您可以使用spawn/1
:
start(M) ->
spawn(fun() -> myProc(M) end).
答案 1 :(得分:3)
由于您使用spawn/3
,因此需要导出myProc
。
另一个问题是,M =/= 0
时你的if条件不包括其他可能性。我会这样做:
-module(roundtrip).
-export([talk/1]).
talk(M) ->
init(M).
init(M) ->
P1 = start(M),
P2 = start(M),
P2 ! {P1, a_message}.
myProc(M) ->
case M of
0 ->
io:format("Bye cruel world!~n");
_ ->
receive
{From, a_message} ->
From ! {self(), a_message},
io:format("~p ~p~n", [self(), M]),
myProc(M-1);
_ ->
io:format("I don't understand~n"),
myProc(M)
end
end.
start(M) ->
spawn(fun() -> myProc(M) end).
请注意,我使用case
代替if
和spawn/1
代替spawn/3
。