【问题标题】:Understanding '_' variable in Erlang理解 Erlang 中的“_”变量
【发布时间】:2015-04-20 13:44:54
【问题描述】:

这里是 Erlang 新手。我来自 Java 背景,发现 Erlan 相当有趣。我正在关注优秀的书“Learn You some Erlang”。

这是书中给出的递归示例,用于反转列表的顺序:

tail_reverse(L) -> tail_reverse(L,[]).

tail_reverse([],Acc) -> Acc;
tail_reverse([H|T],Acc) -> tail_reverse(T, [H|Acc]).

这按预期工作。但是,如果我将代码更改为:

tail_reverse(L) -> tail_reverse(L,[]).

tail_reverse([],_) -> [];
tail_reverse([H|T],Acc) -> tail_reverse(T, [H|Acc]).

这现在总是返回[] 而不管传递的列表的内容。因此,tail_reverse([],_) -> []; 似乎是被调用的行。但是,我的理解是,只有当第一个参数为空且_ 只是一个占位符时才应该调用它。

我在这里错过了什么?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    这一行:

    tail_reverse([], Acc) -> Acc
    

    应该在处理的列表变空时返回累加参数Acc。您将其替换为:

    tail_reverse([], _) -> []
    

    在相同的情况下执行(递归的底部),但忽略先前完成的工作并返回空列表。

    至于_这个变量,和你的问题关系不大,不过在this的回答里有说明。

    【讨论】:

    • 啊!我笨到没看到!需要花更多时间习惯 Erlang 代码/语法。谢谢!
    【解决方案2】:

    @bereal 的回答是正确的。不过,对于“_ 变量在 Erlang 中如何工作。我最近写了一篇关于 _ 变量的博客文章:

    匿名变量由一个下划线 (_) 表示。当需要变量但需要忽略该值时使用匿名变量。匿名变量实际上从来没有绑定到它的值。由于该值永远不会被绑定,因此它可以在一个模式中多次使用,并且每次都可以匹配不同的值。示例:

    1> {_, _} = {foo, bar}.
    {foo, bar}
    2> _.
    * 1: variable '_' is unbound 
    4> {_, Second} = {foo, bar}.
    {foo, bar}
    5> _.
    * 1: variable '_' is unbound 
    6> Second.
    bar
    

    更多信息可在此处获得: http://stratus3d.com/blog/2014/11/05/everything-you-need-to-know-about-erlangs-magic-variable/

    【讨论】:

      猜你喜欢
      • 2014-07-19
      • 2020-08-19
      • 1970-01-01
      • 2019-03-16
      • 2012-11-22
      • 1970-01-01
      • 2019-12-10
      • 2016-01-15
      相关资源
      最近更新 更多