Je me suis simplement demandé s'il y a une bonne raison pour ou même un avantage pour avoir à appeler Pourquoi pas seulement proc code> s utiliser
proc.c.call (args) code> dans ruby, ce qui fait plus haut Syntaxe de la fonction de fonctionnement beaucoup plus verbeuse et moins intuitive. P>
proc (args) code>? Pourquoi dessiner une distinction entre les fonctions, les Lambdas et les blocs? Fondamentalement, tout est la même chose, alors pourquoi cette syntaxe déroutante? Ou y a-t-il un point pour cela que je ne réalisons pas? P>
3 Réponses :
Vous voulez pouvoir passer autour sans em> l'appeler, non? Nécessitant qu'il soit explicitement appelé permet. Sinon, chaque fois que vous avez essayé d'utiliser le processus comme paramètre, vous finiriez par l'appeler. P>
Pour développer: En rubis, les parenthèses pour les appels de méthode sont facultatives, l'interprète ne peut donc pas indiquer la différence entre proc code> ou simplement passer la fermeture autour, et
proc code> Synonyme de
proc () code>.
Dans Ruby, vous pouvez avoir une variable locale et une méthode qui sont nommées FOO. En supposant que la méthode est privée, la seule façon d'appeler ce serait Notez que avec des fonctionnalités telles que foo (args) code> (
self.foo (args) code> ne fonctionnerait pas pour des méthodes privées qui ne peuvent pas avoir un récepteur explicite). Si Ruby permettrait de surcharger l'opérateur (), de sorte que le FOO IN
FOO (bar) code> peut être une variable, il n'y aurait aucun moyen d'appeler la méthode privée FOO, quand il y a aussi une locale Variable nommée foo. p>
définir_method code> et
méthody_missing code>, il n'est pas toujours possible d'éviter les situations où vous avez des méthodes et des variables locales du même nom. P>
Pour scinder les cheveux, il y a une méthode privée que Ruby permet un récepteur explicite pour: Self.foo = (args), de distinguer entre créer une variable locale et appeler la méthode.
vous besoin em> un moyen de faire la distinction entre appeler em> le Dans Python et Ecmascript, c'est simple: avec des parenthèses, c'est un appel, sans que ce n'est pas le cas. En rubis, laissant des parenthèses est aussi em> un appel, il doit donc y avoir des autre em> moyen de distinguer. P>
dans Ruby 1.8, Alors, vous pouvez appeler un et vous pouvez même définir également BTW: le même problème est également pourquoi vous devez utiliser la méthode code> méthode code> pour obtenir une prise d'un objet de méthode. P> proc code> et qui passe em> it-it. p>
PROC # Appelez code> et son alias
PROC # [] code> servir cette distinction. AS de Ruby 1.9,
Obj. (Arg) Code> est le sucre syntaxique pour
obj.Call (arg) code> et
proc # () code> est Aussi em> un alias pour
proc # appeler code>. p>
proc code> comme celui-ci: p>
() code> pour vos em> classes em>. p>