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.
什么都不会改变。
我正在学习 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.
什么都不会改变。