I'm learning Erlang and in Erlang/OTP codebase, Cowboy and others I frequently stumble at lines like this:
_ = ets:new(ac_tab, [set, public, named_table, {read_concurrency,true}]).
Like this:
_ = erlang:cancel_timer(TimerRef).
or even like this:
_ = 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.
I easily can see the reason behind pattern matches like this:
ok = some_mod:some_func().
or like this:
{ok, _} = some_mod:some_func().
This way we check that some function returned a value that fits a pattern, atom ok in first case or tuple {ok, _} where _ means something we don't care about in the second one.
As for a singular _ symbol I'm in doubt as to what this means. It looks like we just could write the expression on the right side of the = sign itself, for the examples above it would look like this:
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.
and nothing would have changed.
2条答案
按热度按时间yiytaume1#
_
匹配用于取消对不匹配返回的dialyzer警告。kwvwclae2#
_
是匿名变量,请参阅变量。它的行为类似于变量,但其值被忽略。如果它位于赋值语句的左手,则可以省略,但你经常会在更复杂的结构中发现它:
你只对值的某些部分感兴趣。