Double Possible:
Que signifie la carte(&:de nom) signifie en Ruby?En Ruby, je sais que si je fais:
some_objects.each(&:foo)
C'est le même que
some_objects.each { |obj| obj.foo }
C'est,
&foo
crée le bloc{ |obj| obj.foo }
, le transforme en un Proc, et passe à chacun. Pourquoi ce travail? Est-ce juste un Rubis cas particulier, ou est-il la raison pourquoi cela fonctionne comme il le fait?
- Que signifie map(&:name) en Ruby ? (5 réponses )
Réponses
Trop de publicités?Votre question est mal, pour ainsi dire. Ce qui se passe ici n'est pas de "esperluette et du côlon", c'est "esperluette et de l'objet". Le côlon dans ce cas est le symbole. Donc, il y a &
et y :foo
.
L' &
des appels to_proc
sur l'objet, et les transmet comme un bloc de la méthode. Dans les Rails, to_proc
est mis en œuvre sur Symbol
, de sorte que ces deux appels sont équivalentes:
something {|i| i.foo }
something(&:foo)
Aussi, to_proc
sur Symbol
est mis en œuvre dans Ruby 1.8.7 et 1.9, il est en fait un "ruby".
Donc, pour résumer: &
des appels to_proc
sur l'objet et le passe comme un bloc de la méthode, et de Rubis implémente to_proc
sur Symbol
.
Je sais que c’est un peu tard pour le jeu, mais pour ce que ça vaut, j’ai écrit un article à ce sujet, avec une explication complète et des exemples de code téléchargeable :
Magic énumérable rubis : L’esperluette unaire
La puissance de ce n’est pas limitée aux tableaux ou énumérables, où vous le voir plus souvent. Il peut être utilisé beaucoup d’endroits.