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

far*_*ble 1 erlang pattern-matching

如果我声明一个函数

test(A) -> 3.
Run Code Online (Sandbox Code Playgroud)

Erlang生成一个关于A未使用的变量的警告.但定义

isEqual(X,X) -> 1.
Run Code Online (Sandbox Code Playgroud)

不会产生任何警告但是

isEqual(X,X) -> 1;
isEqual(X,Y) -> 0.
Run Code Online (Sandbox Code Playgroud)

再次产生警告但仅针对第二行.

jua*_*rro 6

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

如果我们查看从中生成的Core Erlang代码,可能有助于更好地理解is_equal/2.您可以.core通过.erl以下方式编译文件来获取源文件:( erlc +to_core pattern.erl请参阅此处pattern.erl).

这将生成一个pattern.core看起来像这样的文件(module_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
Run Code Online (Sandbox Code Playgroud)

如您所见,源代码is_equal/2中的每个函数子句.erl都被转换为caseCore Erlang中的子句.X确实在第一个子句中使用,因为它需要与另一个参数进行比较.在另一方面既不XY第二子句中被使用.