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 确实在第一个子句中使用,因为它需要与另一个参数进行比较。另一方面,XY 均未在第二个子句中使用。

【讨论】:

我认为它仍然应该生成警告,因为作为用户,我可能忘记在 RHS 上使用 X。如果我理解正确,您的意思是绑定 (X,X) 的模式匹配代码将具有使用 X 的附加约束,并且在(编辑的)定义中的绑定(X,Y)代码中不存在这些约束isEqual(). @farhanhubble 我在答案中添加了更多信息。

以上是关于Erlang 不会警告未使用的函数参数的主要内容,如果未能解决你的问题,请参考以下文章

GNU C相关

如果未提供 URL 中的参数,则 codeigniter 显示警告错误

错误的函数数量和警告:函数 hello_world/0 未使用

Erlang - 产生进程和传递参数

编写一个名为 sort_of_sum 的 Erlang 函数,它接受一个参数 List。该函数的行为应如下所示:

Erlang 中的并发性