无法使用数字参数生成?

时间:2013-07-14 18:48:55

标签: erlang

我是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术语。但那我怎么传递一个数字?

1 个答案:

答案 0 :(得分:4)

错误消息显示第16行的注册调用(crit,Pid)因“badarg”而崩溃,即使参数看起来没问题。如果Pid引用的进程已经死亡(如果它立即崩溃,例如,如果你传递了错误数量的args),或者你已经有一个使用该名称的进程,就会发生这种情况。确保spawn(Mod,Fun,[...])中列表的长度与crit()函数的args数相匹配,并在shell中调用“whereis(critic)”来检查是否有旧的阻止名称被重用的过程。