当我学习Erlang时,我正试图解决前任问题.4.1("回声服务器")来自"Erlang编程"一书(由O'Reilly撰写),我遇到了问题.我的代码看起来像这样:
-module(echo).
-export([start/0, print/1, stop/0, loop/0]).
start() ->
register(echo, spawn(?MODULE, loop, [])),
io:format("Server is ready.~n").
loop() ->
receive
{print, Msg} ->
io:format("You sent a message: ~w.~n", [Msg]),
start();
stop ->
io:format("Server is off.~n");
_ ->
io:format("Unidentified command.~n"),
loop()
end.
print(Msg) -> ?MODULE ! {print, Msg}.
stop() -> ?MODULE ! stop.
Run Code Online (Sandbox Code Playgroud)
不幸的是,我有一些问题.打开按预期工作,它会生成一个新进程并显示"服务器就绪"消息.但是当我尝试使用打印功能时(echo:print("Some message.").例如),我得到了结果,但它不像我想的那样工作.它将我的消息打印为列表(而不是字符串)并生成
=ERROR REPORT==== 18-Jul-2010::01:06:27 ===
Error in process <0.89.0> with exit value: {badarg,[{erlang,register,[echo,<0.93.0>]},{echo,start,0}]}
Run Code Online (Sandbox Code Playgroud)
错误信息.而且,当我尝试停止服务器时,echo:stop()我得到了另一个错误
** exception error: bad argument
in function echo:stop/0
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释一下,这里发生了什么?我是Erlang的新手,此时似乎很难掌握.
当您的loop/0函数收到print消息时,您start/0再次调用它会生成新进程并尝试echo再次注册它.它会导致您的服务器死机而新的服务器没有注册echo,因此您无法再通过print/1函数向其发送消息.
loop() ->
receive
{print, Msg} ->
io:format("You sent a message: ~w.~n", [Msg]),
loop(); % <-- just here!
stop ->
io:format("Server is off.~n");
_ ->
io:format("Unidentified command.~n"),
loop()
end.
Run Code Online (Sandbox Code Playgroud)