【问题标题】:Can't spawn with number parameter?无法使用数字参数生成?
【发布时间】:2013-07-12 15:01:41
【问题描述】:

我是 Erlang 的初学者,我一直在研究“Learn You Some Erlang For Great Good!”。我使用this example code 的修改版本,其中critic 有一个参数:

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 术语。但是那我该如何传递一个数字呢?

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

    【讨论】:

    • 我认为是后者。重新启动外壳后,它就可以工作了。
    猜你喜欢
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2019-08-31
    相关资源
    最近更新 更多