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).
5 Réponses :
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.) P>
2) Appelez chaque fonction explicitement dans weird_func: p> < Pré> xxx pré>
Ce dernier est un peu plus verbeux, mais il fournira une meilleure erreur pour les utilisateurs, s'ils appellent une fonction non existante p> p>
Je suppose que 2) n'est pas une option lorsque vous utilisez {weird_result} -> SPAWN (? Module, Fun1, [Params]);
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
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. P>
2ème est d'appeler les fonctions localement à l'aide de quelque chose comme: p> (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.) p> p>
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) -> ...; code>
Il y a une option de compilation spécifique spécifiquement pour cela:
http://www.erlang.org/doc /man/compile.html p>
Donc, pour votre exemple, insérez une directive comme ceci: p> mais l'avertissement ci-dessus sur le compilateur jeter silencieusement que les fonctions se tient toujours
autant que je sache. p> p>
Vous pouvez également passer De cette façon, la fonction ne sera pas supprimée. p>
Edit: Il suffit d'ajouter mon commentaire afin qu'il puisse être utile pour les futurs lecteurs p> cmd code> dans le format
FUNC1 / 3 CODE>, par exemple: P>
weird_func (amusant func1 / 3, [1, 2, 3]) code> p>
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 code>, 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 code> sera une liste des arguments et la fonction appelée n'aura qu'un seul argument.