Raccourci en rbuy à deux rbuy

Duplication possible:
Que signifie map (&: name) dans Ruby?

En Ruby, je sais que si je le fais:

some_objects.each(&:foo) 

C’est pareil que

 some_objects.each { |obj| obj.foo } 

C’est à dire, &:foo crée le bloc { |obj| obj.foo } { |obj| obj.foo } , le transforme en un Proc et le transmet à chacun. Pourquoi ça marche? Est-ce juste un cas particulier Ruby, ou y a-t-il une raison pour laquelle cela fonctionne comme il le fait?

Votre question est fausse, pour ainsi dire. Ce qui se passe ici n’est pas “esperluette et côlon”, c’est “esperluette et object”. Le deux-points dans ce cas est pour le symbole. Donc, il y a & et il y a :foo .

Le & appelle to_proc sur l’object et le transmet en tant que bloc à la méthode. Dans Rails, to_proc est implémenté sur Symbol , de sorte que ces deux appels sont équivalents:

 something {|i| i.foo } something(&:foo) 

De même, to_proc sur Symbol est implémenté dans Ruby 1.8.7 et 1.9, il s’agit donc d’une “chose ruby”.

Donc, pour résumer: & appelle to_proc sur l’object et le passe en bloc à la méthode, et Ruby implémente to_proc sur Symbol .

Il n’y a rien de spécial dans la combinaison de l’esperluette et du symbole. Voici un exemple qui (ab) utilise la regex:

 class Regexp def to_proc ->(str) { self =~ str ; $1 } end end %w(station nation information).map &/(.*)ion/ => ["stat", "nat", "informat"] 

Ou des entiers.

 class Integer def to_proc ->(arr) { arr[self] } end end arr = [[*3..7],[*14..27],[*?a..?z]] arr.map &4 => [7, 18, "e"] 

Qui a besoin d’ arr.map(&:fifth) quand vous avez arr.map &4 ?