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)
再次产生警告但仅针对第二行.
之所以不生成警告,是因为在第二种情况下,您通过使用相同的变量名称断言(通过模式匹配),第一个和第二个参数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
都被转换为case
Core Erlang中的子句.X
确实在第一个子句中使用,因为它需要与另一个参数进行比较.在另一方面既不X
或Y
第二子句中被使用.