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中模式匹配到单数下划线符号'_'的含义的主要内容,如果未能解决你的问题,请参考以下文章

常用模块

python正则表达式 ---- re模块

Python之正则表达式

Haskell 和 Erlang 中的模式匹配

Python 入门之 内置模块 -- re模块

Erlang 模式匹配顺序