在二郎匿名变量(Anonymous variables in Erlang)

2019-07-04 12:57发布

什么是下划线的变量和命名变量(除了增加可读性的代码),以下划线开始从视二郎编译点之间的精确区别是什么?

例如是__Var不同?

Answer 1:

不在乎变量_是一个非常特殊的变量,它匹配任何东西, 从来都不是绑定到一个值。 当我知道有一些东西在那里,它被使用,但我不在乎的价值是什么,我永远不会使用。 眼看_从未束缚,不能在表达和编译器标记为错误使用。

像变量_Var是完全正常的变量,你可以对阵和将被绑定到值,这意味着它们可以在表达式中使用。 前缀的变量与_约为意图 。 编译器通常会警告你这是在一个模式的约束,但从未使用过的变量,往往是错误的迹象。 但是,编译器不发出警告的前缀变量__Var 。 这样做的目的是,我想给变量命名,命名的东西是好的,但我知道我永远不会使用它。

请记住, _是真正唯一的特殊变量和_Var是正常的变量,如果用来表现为这样。 如果你感觉反常,那么你可以用前缀所有的变量_ ,一切都将仍然工作。



Answer 2:

让我们引用文档在这里:

匿名变量由下划线表示( _ ),并且可以在需要的变量,但其值可以忽略使用。 [...]

开始下划线(变量_ ),例如_Height ,都是正常的变量,而不是匿名的:它们是由在这个意义上,他们将不会产生未使用的变量任何警告编译但忽略。

换句话说,你用_Var形式,当你需要匹配的表达式匹配-但不想使用它进一步和/或你想要显示它的意义。 并使用_变量时,无论是你还是编译器应该关心的是会被它匹配的表达式。

实施例1:

member(_, []) -> [].

在这个功能是不太清楚是什么第一_匹配。 而是直接改写它,就像这样:

member(Elem, []) -> [].

......会产生警告,如果代码与标志编译warn_unused_vars设置。 你仍然可以使你的代码可读性在这里,虽然,通过使用下划线的变量:

member(_Elem, []) -> [].

实施例2:

{_, _, Some} = {1, 2, 3}

该元组匹配会虽然是很没事,作为元组的前两个元素将被完全忽略。

{_Var, _Var, Some} = {1, 2, 3}

然而,这种匹配会失败,:虽然_Var将不会被使用时,它应该是“填满”具有相同的价值! 由于图1是不等于2,则条件这里失败。



文章来源: Anonymous variables in Erlang