Erlang不会对未使用的函数参数发出警告

Erlang不会对未使用的函数参数发出警告,erlang,pattern-matching,Erlang,Pattern Matching,如果我声明一个函数 test(A) -> 3. Erlang生成一个关于未使用变量a的警告。然而,定义 isEqual(X,X) -> 1. 不会产生任何警告,但 isEqual(X,X) -> 1; isEqual(X,Y) -> 0. 再次生成警告,但仅针对第二行。这不会生成警告的原因是,在第二种情况下,您使用相同的变量名通过模式匹配断言isEqual/2的第一个和第二个参数具有相同的值。所以你实际上是在使用参数的值 如果我们看一下由is_equal/2生成的核

如果我声明一个函数

test(A) -> 3.
Erlang生成一个关于未使用变量a的警告。然而,定义

isEqual(X,X) -> 1.
不会产生任何警告,但

isEqual(X,X) -> 1;
isEqual(X,Y) -> 0.

再次生成警告,但仅针对第二行。

这不会生成警告的原因是,在第二种情况下,您使用相同的变量名通过模式匹配断言isEqual/2的第一个和第二个参数具有相同的值。所以你实际上是在使用参数的值

如果我们看一下由is_equal/2生成的核心Erlang代码,可能有助于更好地理解。您可以通过以下方式编译.erl文件来获取.core源文件:erlc+to_core pattern.erl有关详细信息,请参见此处

这将生成一个pattern.core文件,该文件类似于此模块。\u info/[0,1]函数已删除:

module 'pattern' ['is_equal'/2]
  attributes []

'is_equal'/2 = fun (_cor1,_cor0) ->
                   case <_cor1,_cor0> of
                     %% Line 5
                     <X,_cor4> when call 'erlang':'=:=' (_cor4, X) ->
                       1
                     %% Line 6
                     <X,Y> when 'true' ->
                       0
                   end

如您所见,.erl源代码中的每个函数子句都被转换为核心Erlang中的case子句。在第一个子句中确实使用了X,因为它需要与另一个参数进行比较。另一方面,第二条中既不使用X也不使用Y

这不会生成警告的原因是,在第二种情况下,您使用相同的变量名通过模式匹配断言isEqual/2的第一个和第二个参数具有相同的值。所以你实际上是在使用参数的值

如果我们看一下由is_equal/2生成的核心Erlang代码,可能有助于更好地理解。您可以通过以下方式编译.erl文件来获取.core源文件:erlc+to_core pattern.erl有关详细信息,请参见此处

这将生成一个pattern.core文件,该文件类似于此模块。\u info/[0,1]函数已删除:

module 'pattern' ['is_equal'/2]
  attributes []

'is_equal'/2 = fun (_cor1,_cor0) ->
                   case <_cor1,_cor0> of
                     %% Line 5
                     <X,_cor4> when call 'erlang':'=:=' (_cor4, X) ->
                       1
                     %% Line 6
                     <X,Y> when 'true' ->
                       0
                   end

如您所见,.erl源代码中的每个函数子句都被转换为核心Erlang中的case子句。在第一个子句中确实使用了X,因为它需要与另一个参数进行比较。另一方面,第二条中既不使用X也不使用Y

可能是因为这里使用了X,因为Erlang比较了第一个参数和第二个参数的相等性。可能是因为这里使用了X,因为Erlang比较了第一个参数和第二个参数的相等性。我认为它仍然应该生成警告,因为作为一个用户,我可能忘记了在RHS上使用X。如果我理解正确,您的意思是绑定X的模式匹配代码,X将有使用X的附加约束,而bindingX的代码中没有这些约束,编辑后的isEqual定义中的Y。@farhanhubble我在答案中添加了更多信息。我认为它仍然会产生警告,因为作为一个用户,我可能忘记了在RHS上使用X。如果我理解正确,您的意思是,绑定X,X的模式匹配代码将具有使用X的附加约束,而在编辑的isEqual定义中,绑定X,Y的代码中不存在这些约束。@farhanhubble我在答案中添加了更多信息。