我编写了一个Erlang模块,其中并未直接调用所有内部函数。相反,有几个函数看起来像这样:
weird_func(Cmd, Args) ->
?MODULE:Cmd(Args).
这是一个简化的例子,但你明白了。 Erlang编译器会发出有关未使用函数的警告,实际上它们实际上是使用的,而不是直接使用。有没有办法抑制这些警告?理想情况下,我不想压制所有这些警告,而是我想告诉Erlang编译器将一些特定函数视为特殊情况。
答案 0 :(得分:14)
有专门针对此的编译选项:
http://www.erlang.org/doc/man/compile.html
所以,为你的例子插入一个这样的指令:
-compile([{nowarn_unused_function, [{ wierd_function_1,Arity1 },
... ]}]).
但是关于编译器静默丢弃函数的上述警告仍然存在 据我所知。
答案 1 :(得分:11)
这不仅仅是抑制警告的问题。无法以您想要的方式调用未导出的函数。
-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语法导出使其可用的函数。
答案 2 :(得分:6)
如果某个函数既未导出也未显式调用,则报告为未使用。所以你有两种方法:
1)导出间接使用的功能。如果您不希望从模块外部调用这些函数,可以在文档中(以及注释中)突出显示它。
2)在weird_func中明确调用每个函数:
weird_func(fun1, [A1,A2]) ->
fun1(A1, A2);
weird_func(fun2, []) ->
fun2();
weird_func(fun3, [A1,A2,A3]) ->
fun3(A1,A2,A3).
后者有点冗长,但如果用户调用不存在的函数,它将为用户提供更好的错误
答案 3 :(得分:2)
你基本上有两个选择。
第一是导出功能,从而“使用”它们。这也是您的原始示例工作所必需的。
第二是使用类似的东西在本地调用函数:
weird_func(Cmd, Args) ->
case Cmd of
func1 -> func1(Arg1, Arg2, Arg3);
func2 -> func2(Arg1);
...
(请注意,我的示例不会编译。您必须根据您调用的函数将Args参数拆分为多个部分。)
答案 4 :(得分:1)
您还可以Cmd
格式传递fun func1/3
,例如:
weird_func(fun func1/3, [1, 2, 3])
这样就不会删除该功能。
编辑:刚刚添加了我的评论,因此对未来的读者非常有用