Principalement je veux savoir si je peux envoyer une fonction a-t-il de sens? p> p>
3 Réponses :
Vous pouvez envoyer n'importe quel terme Erlang valide. Bien que vous devez faire attention lorsque vous envoyez des amusants. Tout amusement référençant une fonction à l'intérieur d'un module a besoin de ce module sur le nœud cible pour fonctionner: dans cet exemple, io code> existe sur les deux nœuds et fonctionne envoyer une fonction de
io code> comme amusant. Toutefois,
myModule code> n'existe que sur le premier nœud et que le plaisir génère une exception
undef code> lorsqu'il est appelé sur l'autre noeud. P> p>
Qu'en est-il des fonctions anonymes?
Si par là, vous voulez dire des amusements anonymes, il a le même problème. C'est à dire. Le module où il est défini doit exister sur le nœud distant.
ici est un article intéressant sur "Passage d'amusement à d'autres nœuds Erlang". Pour le reprendre brièvement: P>
[...] comme vous le savez peut-être, Erlang Distribution Fonctionne en envoyant le codage binaire de termes; et donc envoyer un plaisir est aussi essentiellement fait en le codant en utilisant erlang: term_to_binary / 1; en passant la binaire résultant à un autre nœud, et puis décoder à nouveau en utilisant erlang: binaire_to_therm / 1. [...] C'est assez évident pour la plupart des types de données; Mais comment ça va Travailler pour des objets de fonction? P>
Lorsque vous encodez un plaisir, ce qui est codé est juste une référence à la fonction, pas la fonction de mise en œuvre. [...] p>
[...] La définition de la fonction n'est pas transmise; Juste exactement d'informations pour recréer le plaisir à un autre nœud si le module est là. P>
[...] Si le module contenant le plaisir n'a pas encore été chargé et que le nœud cible fonctionne en mode interactif; Ensuite, le module est tenté de chargé à l'aide du mécanisme de chargement du module régulier (contenu dans le module error_handler); Et puis il essaie de voir si un amusement avec l'identifiant donné est disponible dans ledit module. Cependant, cela ne se produit que paresseusement lorsque vous essayez d'appliquer la fonction. P>
[...] Si vous n'essayez jamais d'appliquer la fonction, rien de mal n'arrive. Le plaisir peut être transmis à un autre noeud (qui a le module / amusement en question), puis tout le monde est heureux. Peut-être que le nœud cible a un module chargé dudit nom, mais peut-être dans une version différente; Ce qui serait alors très susceptible d'avoir une différence de somme de contrôle MD5 différente, alors vous obtenez l'erreur BadFun si vous essayez de l'appliquer. P> blockQuote>
Je vous suggérerais de lire tout l'article, car c'est extrêmement intéressant. P>
Quant aux fonctions anonymes, il semble qu'ils puissent être envoyés et travailler comme prévu.
T1 @ localhost: p> t2 @ localhost: p> < PRE> XXX PRE> Je ajoute une couverture logique à une application construite sur Riak-Core, et la fusion em> des résultats recueillis peut être délicate si les fonctions anonymes ne peuvent pas être utilisées dans des messages. < / p> Consultez également riak_kv / src / riak_kv_coverage_filter.erl < / p> riak_kv peut l'utiliser sur filtre code> résultat, je suppose. p> p>