Erlang 中模式匹配到单数下划线符号“_”的含义

Meaning of pattern match to a singular underscore sign '_' in Erlang

我正在学习 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().

通过这种方式,我们检查某个函数返回的值是否符合模式,第一种情况下是原子 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.

什么都不会改变。

_ 匿名变量 ,参见 Variables。它的行为像一个变量,但它的值被忽略了。

如果它位于赋值的左侧,则可以省略。但是你会经常在更复杂的结构中发现它:

{key, Value, _} = some_function(),

您只对值的某些部分感兴趣。

_ 匹配用于抑制不匹配 returns 的 dialyzer 警告。