Подавление Erlang предупреждений о «неиспользуемой функции» - PullRequest
6 голосов
/ 22 июля 2010

Я написал модуль Erlang, в котором не все внутренние функции вызываются напрямую.Вместо этого есть пара функций, которые выглядят примерно так:

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

Это упрощенный пример, но вы поняли идею.Компилятор Erlang выдает предупреждения о неиспользуемых функциях, когда они фактически используются, а не напрямую.Есть ли способ подавить эти предупреждения?В идеале я не хочу подавлять все такие предупреждения, а скорее хочу сказать компилятору Erlang рассмотреть несколько конкретных функций в качестве особых случаев.

Ответы [ 5 ]

14 голосов
/ 12 сентября 2012

есть опция компиляции специально для этого:

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

, поэтому для вашего примера вставьте директиву, подобную этой:

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

, но вышеНасколько я знаю, предупреждение о том, что компилятор молча отбрасывает функции, остается в силе.

11 голосов
/ 23 июля 2010

Это не просто вопрос подавления предупреждения.Неэкспортированная функция не может быть вызвана так, как вы собираетесь.

-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.

6 голосов
/ 22 июля 2010

Если функция не экспортируется и не вызывается явно, она считается неиспользованной.Таким образом, у вас есть два пути:

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).

Последний вариант немного более многословен, но обеспечит лучшую ошибку для пользователей, если они вызовут несуществующую функцию

2 голосов
/ 23 июля 2010

В основном у вас есть две опции.

1-й - экспортировать функции, таким образом, «используя» их.Это также необходимо для того, чтобы ваш исходный пример работал.

2-й - это вызов функций локально, используя что-то вроде:

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

(Обратите внимание, что мой пример не компилируется. Вы должныразбить аргумент Args на части в зависимости от того, какую функцию вы вызываете.)

1 голос
/ 13 октября 2014

Вы также можете передать Cmd в формате fun func1/3, например:

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

Таким образом, функция не будет удалена.

Изменить: Просто добавил мой комментарий, чтобы он мог быть полезен для будущих читателей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...