341 votes

Raccourci du côlon esperluette rubis

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?

506voto

August Lilleaas Points 25812

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.

93voto

Michiel de Mare Points 15888

Il n’y a rien de spécial au sujet de la combinaison de l’esperluette et le symbole. Voici un exemple que (ab) utilise l’expression régulière :

Ou entiers.

Qui a besoin de quand vous avez ?

23voto

Steve Graham Points 2229

J’ai réellement blogué sur cette chose la semaine dernière :

http://swaggadocio.com/post/287689063

12voto

Jaime Bellmyer Points 13815

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X