Erlang中模式匹配到单数下划线符号'_'的含义
Posted
技术标签:
【中文标题】Erlang中模式匹配到单数下划线符号\'_\'的含义【英文标题】:Meaning of pattern match to a singular underscore sign '_' in ErlangErlang中模式匹配到单数下划线符号'_'的含义 【发布时间】:2021-03-27 00:37:35 【问题描述】:我正在学习 Erlang,在 Erlang/OTP 代码库、Cowboy 和其他代码库中,我经常遇到这样的问题:
_ = ets:new(ac_tab, [set, public, named_table, read_concurrency,true]).
像这样:
_ = erlang:cancel_timer(TimerRef).
甚至像这样:
_ = case Version of
'HTTP/1.1' ->
Transport:send(Socket, cow_http:response(StatusCode, 'HTTP/1.1',
headers_to_list(Headers)));
%% Do not send informational responses to HTTP/1.0 clients. (RFC7231 6.2)
'HTTP/1.0' ->
ok
end.
我可以很容易地看到模式匹配背后的原因:
ok = some_mod:some_func().
或者像这样:
ok, _ = some_mod:some_func().
通过这种方式,我们检查某个函数是否返回了一个符合模式的值,第一种情况下的 atom ok 或元组 ok, _ ,其中 _ 表示我们在第二种情况下不关心的东西。
至于单数 _ 符号,我怀疑这意味着什么。看起来我们可以在 = 符号本身的右侧编写表达式,对于上面的示例,它看起来像这样:
ets:new(ac_tab, [set, public, named_table, read_concurrency,true]).
erlang:cancel_timer(TimerRef).
case Version of
'HTTP/1.1' ->
Transport:send(Socket, cow_http:response(StatusCode, 'HTTP/1.1',
headers_to_list(Headers)));
%% Do not send informational responses to HTTP/1.0 clients. (RFC7231 6.2)
'HTTP/1.0' ->
ok
end.
什么都不会改变。
【问题讨论】:
对我来说它只是一个占位符,以防将来需要返回值,我们知道在哪里可以找到它们......尽管我会更具体地提供至少_VariableName
而不仅仅是一个下划线以避免编译器警告
如果你在没有任何变量绑定的情况下尝试这个会发生什么? https://erlang.org/doc/man/erlang.html#display-1
【参考方案1】:
_
匹配用于抑制不匹配返回的dialyzer 警告。
【讨论】:
好的,谢谢!现在的问题是为什么透析器在这种情况下认为这是必要的.. 如果查看-Wunmatched_returns
的透析器文档,它会更详细地解释发生了什么。【参考方案2】:
_
是匿名变量,参见Variables。它的行为就像一个变量,但它的值被忽略了。
如果它位于赋值的左侧,则可以省略。但您经常会发现它具有更复杂的结构:
key, Value, _ = some_function(),
您只对价值的某些部分感兴趣。
【讨论】:
我知道,但我看不出在这种特定情况下使用它的原因,这对我来说似乎毫无意义。您的示例对我来说看起来不错,因为我们检查 some_function 返回一个元组,其中键、值原子位于第一和第二位,而我们不关心的位于第三位。以上是关于Erlang中模式匹配到单数下划线符号'_'的含义的主要内容,如果未能解决你的问题,请参考以下文章