Подавление Erlang “неиспользованные функциональные” предупреждения

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

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

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

6
задан Nick 22 July 2010 в 15:23
поделиться

3 ответа

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

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

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

6
ответ дан 8 December 2019 в 02:34
поделиться

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

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

11
ответ дан 8 December 2019 в 02:34
поделиться

У вас есть два варианта.

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

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

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

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

.
2
ответ дан 8 December 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: