Erlang 不会警告未使用的函数参数
Posted
技术标签:
【中文标题】Erlang 不会警告未使用的函数参数【英文标题】:Erlang Doesn't Warn About Unused Function Argument 【发布时间】:2017-07-17 00:40:49 【问题描述】:如果我声明一个函数
test(A) -> 3.
Erlang 生成关于变量A
未使用的警告。但是定义
isEqual(X,X) -> 1.
不会产生任何警告,但
isEqual(X,X) -> 1;
isEqual(X,Y) -> 0.
再次产生警告,但仅针对第二行。
【问题讨论】:
可能是因为这里使用了X
,因为 Erlang 比较第一个参数和第二个参数是否相等。
【参考方案1】:
这不会产生警告的原因是因为在第二种情况下,您通过使用相同的变量名称断言(通过模式匹配)isEqual/2
的第一个和第二个参数具有相同的值。所以你实际上是在使用参数的值。
如果我们查看由 is_equal/2
生成的 Core Erlang 代码,可能有助于更好地理解。您可以通过以下方式编译您的.erl
文件来获得.core
源文件: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
如您所见,.erl
源代码中 is_equal/2
中的每个函数子句都被转换为 Core Erlang 中的 case
子句。 X
确实在第一个子句中使用,因为它需要与另一个参数进行比较。另一方面,X
或 Y
均未在第二个子句中使用。
【讨论】:
我认为它仍然应该生成警告,因为作为用户,我可能忘记在 RHS 上使用 X。如果我理解正确,您的意思是绑定 (X,X) 的模式匹配代码将具有使用 X 的附加约束,并且在(编辑的)定义中的绑定(X,Y)代码中不存在这些约束isEqual()
.
@farhanhubble 我在答案中添加了更多信息。以上是关于Erlang 不会警告未使用的函数参数的主要内容,如果未能解决你的问题,请参考以下文章
如果未提供 URL 中的参数,则 codeigniter 显示警告错误
错误的函数数量和警告:函数 hello_world/0 未使用