8
votes

Supprimer Erlang "Fonction inutilisée" Avertissements

J'ai écrit un module Erlang où toutes les fonctions internes ne sont pas directement appelées. Au lieu de cela, il y a quelques fonctions qui ressemblent à ceci:

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


1 commentaires

Appeler une fonction de cette manière ne fonctionnera que si elle a été exportée. Vous faites un appel "externe", même si vous utilisez ? Module , qui n'est qu'une macro prédéfinie qui se développe au nom du module et qui transmettent le nom de la fonction sous forme d'argument. N.b. que args sera une liste des arguments et la fonction appelée n'aura qu'un seul argument.


5 Réponses :


7
votes

Si une fonction n'est ni exportée, ni explicitement appelée, elle est signalée comme inutilisée. Vous avez donc deux façons d'aller:

1) exportez les fonctions utilisées indirectement. Si vous ne voulez pas que ces fonctions soient appelées de l'extérieur du module, vous pouvez la mettre en évidence dans la documentation (et dans les commentaires.)

2) Appelez chaque fonction explicitement dans weird_func: < Pré> xxx

Ce dernier est un peu plus verbeux, mais il fournira une meilleure erreur pour les utilisateurs, s'ils appellent une fonction non existante


1 commentaires

Je suppose que 2) n'est pas une option lorsque vous utilisez {weird_result} -> SPAWN (? Module, Fun1, [Params]);



11
votes

Ce n'est pas seulement une question de supprimer l'avertissement. Une fonction inextentée ne peut pas être appelée dans la façon dont vous avez l'intention.

-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


0 commentaires

2
votes

Vous avez essentiellement deux options.

1st est d'exporter les fonctions, donc "en utilisant" eux. Ceci est également nécessaire pour que votre exemple original fonctionne.

2ème est d'appeler les fonctions localement à l'aide de quelque chose comme: xxx

(Notez que mon exemple n'est pas 'T Compiler. Vous devez diviser l'argument args en morceaux en fonction de la fonction que vous appelez.)


1 commentaires

Je pense que l'utilisation de la correspondance des motifs est préférable dans ce cas: weird_func (func1, args) -> ...; weird_func (Func2, args) -> ...;



19
votes

Il y a une option de compilation spécifique spécifiquement pour cela:

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

Donc, pour votre exemple, insérez une directive comme ceci: xxx

mais l'avertissement ci-dessus sur le compilateur jeter silencieusement que les fonctions se tient toujours autant que je sache.


0 commentaires

2
votes

Vous pouvez également passer cmd dans le format FUNC1 / 3 , par exemple:

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

De cette façon, la fonction ne sera pas supprimée.

Edit: Il suffit d'ajouter mon commentaire afin qu'il puisse être utile pour les futurs lecteurs


0 commentaires