这个gen_server.erl代码的目的是什么?

时间:2015-01-01 04:02:26

标签: erlang

unregister_name({local,Name}) ->
    _ = (catch unregister(Name));
unregister_name({global,Name}) ->
    _ = global:unregister_name(Name);
unregister_name({via, Mod, Name}) ->
    _ = Mod:unregister_name(Name);
unregister_name(Pid) when is_pid(Pid) ->
    Pid.

这是gen_server.erl。如果_始终匹配且匹配始终评估为右侧表达式,那么_ = expression()行在此处执行了什么操作?

3 个答案:

答案 0 :(得分:7)

通常_ = ...匹配用于在使用-Wunmatched_returns选项时对有关不匹配函数返回值的dialyzer警告进行安静。正如文档所述:

-Wunmatched_returns
    Include warnings for function calls which ignore a structured return value or
    do not match against one of many possible return value(s).

通过明确地将返回值与_"不关心"变量,你可以使用这个有用的透析器选项,而不必看到你不关心的返回值的警告。

答案 1 :(得分:3)

在Erlang中,函数的最后一个表达式是它的返回值,因此可能有人想要检查,global:unregister_name/1Mod:unregister_name(Name)返回什么,并尝试对其进行模式匹配。

_ = expression()并没有特别做任何事情,但提示,应忽略此返回值(例如,因为它们没有记录,可能会有变化)。但是在最后一个表达式中,显式返回了Pid。这意味着,你可以像这样模式匹配:

case unregister_name(Something) of
    Pid when is_pid(Pid) -> foo();
    _ -> bar()
end.

总结一下:那些行没有在那里做任何事情,但是当其他人正在阅读源代码时,他们会显示原始程序员的意图。

不幸的是,这个特定的功能没有导出,原始模块从未用于模式匹配,所以我没有一个例子来支持它:)

答案 2 :(得分:1)

我会注意到自come across this以后:

  

十大权力 - 制定安全关键准则的规则

     

Gerard J. Holzmann

     

NASA / JPL可靠软件实验室帕萨迪纳,加利福尼亚州

     

91109

     

[...]

     
      
  1. 规则:每个调用函数必须检查非void函数的返回值,并且必须检查参数的有效性   在每个功能里面。

         

    理由:这可能是最常见的   违反规则,因此作为一般规则有点更可疑。   在其最严格的形式中,这条规则意味着即使是返回值   必须检查printf语句和文件关闭语句。一罐   但是,如果对错误的回应是正确的,那就说明了   没有什么不同于对成功的反应,没有什么意义   显式检查返回值。这通常是电话的情况   打印并关闭。在这样的情况下,可以接受   显式地将函数返回值转换为(void) - 从而   表明程序员明确而不是意外地决定   忽略返回值。在更可疑的情况下,应该发表评论   目前解释为什么返回值是无关紧要的。在多数情况下,   但是,不应忽略函数的返回值,   特别是如果错误返回值必须向上传播函数   呼叫链。标准库通常违反此规则   潜在的严重后果。例如,看看如果你发生了什么   意外地执行strlen(0)或strcat(s1,s2,-1)   标准C字符串库 - 它不漂亮。保持一般   规则,我们确保必须通过机械来证明例外   跳棋标记违规行为。通常,遵守更容易   规则,而不是解释为什么不合规可能是可以接受的。

  2.