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