2010-07-22 23 views
6

Escribí un módulo Erlang en el que no se llaman directamente todas las funciones internas. En cambio, hay un par de funciones que se parecen a esto:Suprimir las advertencias de "funciones no utilizadas" de Erlang

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

Es un ejemplo simplificado, pero se entiende la idea. El compilador de Erlang escupe advertencias sobre las funciones no utilizadas, cuando en realidad se usan, pero no directamente. ¿Hay alguna forma de suprimir estas advertencias? Idealmente, no quiero suprimir todas esas advertencias, pero me gustaría decir al compilador de Erlang que considere algunas funciones específicas como casos especiales.

+2

llamar a una función de esa manera sólo funcionará si se ha exportado. En realidad, está haciendo una llamada "externa" incluso si usa '? MODULE', que es solo una macro predefinida que se expande al nombre del módulo y pasa el nombre de la función como argumento. nótese bien ese 'Args' será una lista de los argumentos y la función llamada solo tendrá un argumento. – rvirding

Respuesta

6

Si una función no se exporta, ni se llama explícitamente, se informa como no utilizada. Entonces tiene dos formas de hacerlo:

1) Exportar las funciones que se usan indirectamente. Si no desea que esas funciones a ser llamadas desde fuera del módulo, se puede resaltar esto en la documentación

2) Llame a cada función de manera explícita en weird_func (y en los comentarios.):

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

Este el último es un poco más detallado, pero proporcionará un mejor error para los usuarios, si llaman a una función no existente

+1

Supongo que 2) no es una opción cuando usas {weird_result} -> spawn (? MODULE, fun1, [params]); – Daniel

11

No se trata solo de suprimir la advertencia. No se puede llamar a una función no exportada de la manera que usted desea.

-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 

El compilador puede soltar completamente la función no utilizada y no exportada. Simplemente exporte la función haciéndola disponible usando la sintaxis? MÓDULO: F.

2

Básicamente tiene dos opciones.

Primero es exportar las funciones, "usándolas". Esto también es necesario para que funcione su ejemplo original.

segundo es llamar a las funciones localmente usando algo como: (.. Tenga en cuenta que mi ejemplo no compila Hay que dividir el argumento Args en pedazos dependiendo de la func que está llamando)

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

+0

Creo que es preferible utilizar la coincidencia de patrones en este caso: 'weird_func (func1, Args) -> ...; weird_func (func2, Args) -> ...; ' –

12

hay una opción de compilación específicamente para esto:

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

, por tu ejemplo de inserción de anuncios IRECTIVA así:

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

pero la advertencia anterior sobre el compilador descartar silenciosamente las funciones sigue en pie Por lo que yo sé.

1

También puede pasar Cmd en el formato fun func1/3, por ejemplo:

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

De esta manera no se redujo la función.

Editar: acaba de añadir mi comentario por lo que puede ser útil para futuros lectores

Cuestiones relacionadas