如果我声明一个函数
test(A) -> 3.
Erlang生成有关变量A
未使用的警告。然而定义
isEqual(X,X) -> 1.
不产生任何警告,但
isEqual(X,X) -> 1;
isEqual(X,Y) -> 0.
再次产生警告,但仅针对第二行。
之所以不生成警告,是因为在第二种情况下,您通过使用相同的变量名称断言(通过模式匹配),第一个和第二个参数isEqual/2
具有相同的值。所以你实际上是在使用参数的值。
如果我们查看从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
如您所见,源代码is_equal/2
中的每个函数子句.erl
都被转换为case
Core Erlang 中的一个子句。X
确实在第一个子句中使用,因为它需要与另一个参数进行比较。另一方面,在第二个子句中既不使用X
或Y
也不使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句