【问题标题】:Suppressing Erlang "unused function" warnings抑制 Erlang “未使用的功能”警告
【发布时间】:2011-03-19 15:21:41
【问题描述】:

我写了一个 Erlang 模块,并不是所有的内部函数都被直接调用。相反,有几个函数看起来像这样:

weird_func(Cmd, Args) ->
    ?MODULE:Cmd(Args).

这是一个简化的例子,但你明白了。 Erlang 编译器会发出关于未使用函数的警告,而实际上它们实际上是被使用的,只是没有直接使用。有什么方法可以抑制这些警告吗?理想情况下,我不想禁止所有此类警告,而是我想告诉 Erlang 编译器将一些特定函数视为特殊情况。

【问题讨论】:

  • 以这种方式调用一个函数只有在它被导出后才有效。即使您使用?MODULE,您实际上是在对其进行“外部”调用,这只是一个扩展为模块名称的预定义宏,并将函数名称作为参数传递。注: Args 将是一个参数列表,被调用的函数只有一个参数。

标签: erlang warnings


【解决方案1】:

有一个专门用于此的编译选项:

http://www.erlang.org/doc/man/compile.html

所以,为您的示例插入这样的指令:

-compile([{nowarn_unused_function, [{ wierd_function_1,Arity1 },
                                       ... ]}]).

但是上面关于编译器静默丢弃函数的警告仍然存在 据我所知。

【讨论】:

    【解决方案2】:

    这不仅仅是抑制警告的问题。无法以您想要的方式调用未导出的函数。

    -module(foo).
    -export([f/0]).
    f() -> ?MODULE:g().
    g() -> ok.
    
    1> c(foo).
    ./foo.erl:4: Warning: function g/0 is unused
    {ok,foo}
    2> foo:f().
    ** exception error: undefined function foo:g/0
    

    编译器可以完全删除未使用的、未导出的函数。只需使用 ?MODULE:F 语法导出使其可用的函数即可调用。

    【讨论】:

      【解决方案3】:

      如果一个函数既没有导出也没有显式调用,则报告为未使用。所以你有两条路可以走:

      1) 导出间接使用的函数。如果您不希望从模块外部调用这些函数,您可以在文档(和 cmets)中突出显示这一点。

      2) 在奇怪的函数中显式调用每个函数:

      weird_func(fun1, [A1,A2]) ->
          fun1(A1, A2);
      weird_func(fun2, []) ->
          fun2();
      weird_func(fun3, [A1,A2,A3]) ->
          fun3(A1,A2,A3).
      

      后者有点冗长,但如果用户调用不存在的函数,它会为用户提供更好的错误

      【讨论】:

      • 我猜 2) 当你使用 {奇怪的结果} -> spawn(?MODULE, fun1, [params]); 时不是一个选项;
      【解决方案4】:

      你基本上有两种选择。

      第一个是导出函数,从而“使用”它们。这也是您的原始示例正常工作所必需的。

      第二个是使用类似的方法在本地调用函数:

      weird_func(Cmd, Args) ->
         case Cmd of
            func1 -> func1(Arg1, Arg2, Arg3);
            func2 -> func2(Arg1);
            ...
      

      (请注意,我的示例无法编译。您必须根据所调用的函数将 Args 参数拆分为多个部分。)

      【讨论】:

      • 我认为在这种情况下使用模式匹配更可取:weird_func(func1, Args) -> ...; weird_func(func2, Args) -> ...;
      【解决方案5】:

      你也可以通过fun func1/3格式传递Cmd,例如:

      weird_func(fun func1/3, [1, 2, 3])

      这样函数就不会被丢弃。

      编辑:刚刚添加了我的评论,以便对未来的读者有用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-16
        • 1970-01-01
        • 1970-01-01
        • 2015-04-20
        • 1970-01-01
        • 2014-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多