我是Erlang的初学者,我一直在努力学习“为了好大学而学习一些Erlang!”。我使用this example code的修改版本,其中评论家有一个参数:
critic(Count) ->
receive
{From, {"Rage Against the Turing Machine", "Unit Testify"}} ->
From ! {self(), {"They are great!", Count}};
{From, {"System of a Downtime", "Memoize"}} ->
From ! {self(), {"They're not Johnny Crash but they're good.", Count}};
{From, {"Johnny Crash", "The Token Ring of Fire"}} ->
From ! {self(), {"Simply incredible.", Count}};
{From, {_Band, _Album}} ->
From ! {self(), {"They are terrible!", Count}}
end,
critic(Count).
这是产生的:
restarter() ->
process_flag(trap_exit, true),
Pid = spawn_link(?MODULE, critic, [my_atom]),
register(critic, Pid),
receive
{'EXIT', Pid, normal} -> % not a crash
ok;
{'EXIT', Pid, shutdown} -> % manual termination, not a crash
ok;
{'EXIT', Pid, _} ->
restarter()
end.
模块的使用方式如下:
1> c(linkmon).
{ok,linkmon}
2> Monitor = linkmon:start_critic().
<0.163.0>
3> linkmon:judge("Rage Against the Turing Machine", "Unit Testify").
{"They are great!",my_atom}
现在,当我将“my_atom”更改为一个简单的数字(如255)时,显示器崩溃了:
1> c(linkmon).
{ok,linkmon}
2> Monitor = linkmon:start_critic().
=ERROR REPORT==== 14-Jul-2013::20:42:20 ===
Error in process <0.173.0> with exit value: {badarg,[{erlang,register,[critic,<0.174.0>] []},{linkmon,restarter,0,[{file,"linkmon.erl"},{line,16}]}]}
然而,当我发送[1]时它确实有效(所以代码是“spawn(.....,[[255]])。”) 为什么我不能通过一个号码?只是浏览spawn / 3的文档并没有真正告诉我任何事情......除了可能我错过了一些东西而且一个数字不是Erlang术语。但那我怎么传递一个数字?
答案 0 :(得分:4)
错误消息显示第16行的注册调用(crit,Pid)因“badarg”而崩溃,即使参数看起来没问题。如果Pid引用的进程已经死亡(如果它立即崩溃,例如,如果你传递了错误数量的args),或者你已经有一个使用该名称的进程,就会发生这种情况。确保spawn(Mod,Fun,[...])中列表的长度与crit()函数的args数相匹配,并在shell中调用“whereis(critic)”来检查是否有旧的阻止名称被重用的过程。