什么是下划线的变量和命名变量(除了增加可读性的代码),以下划线开始从视二郎编译点之间的精确区别是什么?
例如是_
和_Var
不同?
什么是下划线的变量和命名变量(除了增加可读性的代码),以下划线开始从视二郎编译点之间的精确区别是什么?
例如是_
和_Var
不同?
不在乎变量_
是一个非常特殊的变量,它匹配任何东西, 从来都不是绑定到一个值。 当我知道有一些东西在那里,它被使用,但我不在乎的价值是什么,我永远不会使用。 眼看_
从未束缚,不能在表达和编译器标记为错误使用。
像变量_Var
是完全正常的变量,你可以对阵和将被绑定到值,这意味着它们可以在表达式中使用。 前缀的变量与_
约为意图 。 编译器通常会警告你这是在一个模式的约束,但从未使用过的变量,往往是错误的迹象。 但是,编译器不发出警告的前缀变量_
像_Var
。 这样做的目的是,我想给变量命名,命名的东西是好的,但我知道我永远不会使用它。
请记住, _
是真正唯一的特殊变量和_Var
是正常的变量,如果用来表现为这样。 如果你感觉反常,那么你可以用前缀所有的变量_
,一切都将仍然工作。
让我们引用文档在这里:
匿名变量由下划线表示(
_
),并且可以在需要的变量,但其值可以忽略使用。 [...]开始下划线(变量
_
),例如_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,则条件这里失败。