如果我宣布一个功能
test(A) -> 3.
Erlang会生成有关未使用变量A
的警告。但是定义
isEqual(X,X) -> 1.
不会发出任何警告,但
isEqual(X,X) -> 1;
isEqual(X,Y) -> 0.
再次产生警告但仅针对第二行。
答案 0 :(得分:6)
这不会产生警告的原因是因为在第二种情况下,您通过使用相同的变量名称断言(通过模式匹配),isEqual/2
的第一个和第二个参数具有相同的值。所以你实际上是在使用参数的值。
如果我们查看从is_equal/2
生成的Core Erlang代码,可能会有所帮助。您可以通过以下方式编译.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
如您所见,is_equal/2
源代码中.erl
的每个函数子句都被转换为Core Erlang中的case
子句。 X
确实在第一个子句中使用,因为它需要与另一个参数进行比较。另一方面,第二个子句中不使用X
或Y
。