6
votes

Pourquoi le ruby ​​nécessite-t-il une invocation des procédations?

Je me suis simplement demandé s'il y a une bonne raison pour ou même un avantage pour avoir à appeler proc s utiliser proc.c.call (args) dans ruby, ce qui fait plus haut Syntaxe de la fonction de fonctionnement beaucoup plus verbeuse et moins intuitive.

Pourquoi pas seulement proc (args) ? 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?


0 commentaires

3 Réponses :


2
votes

Vous voulez pouvoir passer autour sans 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.


1 commentaires

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 ou simplement passer la fermeture autour, et proc Synonyme de proc () .



6
votes

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 foo (args) ( self.foo (args) 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) 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.

Notez que avec des fonctionnalités telles que définir_method et méthody_missing , il n'est pas toujours possible d'éviter les situations où vous avez des méthodes et des variables locales du même nom.


1 commentaires

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.



11
votes

vous besoin un moyen de faire la distinction entre appeler le proc et qui passe it-it.

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 un appel, il doit donc y avoir des autre moyen de distinguer.

dans Ruby 1.8, PROC # Appelez et son alias PROC # [] servir cette distinction. AS de Ruby 1.9, Obj. (Arg) est le sucre syntaxique pour obj.Call (arg) et proc # () est Aussi un alias pour proc # appeler .

Alors, vous pouvez appeler un proc comme celui-ci:

  • foo.call (1, 2, 3)
  • FOO [1, 2, 3]
  • foo. (1, 2, 3)

    et vous pouvez même définir également () pour vos classes .

    BTW: le même problème est également pourquoi vous devez utiliser la méthode méthode pour obtenir une prise d'un objet de méthode.


0 commentaires