2014-07-01 6 views
1

J'ai code comme ceciLa différence entre: + et &: +

list << num if num.to_s.split("").map(&:to_i).map(&:factorial).inject(:+) == num 

Il fonctionne, et je me demandais comment inject fonctionne sans & (esperluette) devant la :+. Je demande à quelqu'un d'expliquer quelles sont les différences entre :+ et &:+.

+1

l'un d'eux porte un chapeau? ... désolé, n'a pas pu résister – musefan

+2

@musefan Non, l'un d'eux a des poils. – sawa

Répondre

5

&:+ est traduite en un proc, tandis que :+ est un symbole. inject supports de réception des symboles, ce qui se traduit en interne à un proc:

Si vous spécifiez un bloc, puis pour chaque élément ENUM le bloc est une valeur passer de l'accumulateur (mémo) et l'élément. Si vous spécifiez un symbole à la place, chaque élément de la collection sera transmis à la méthode nommée du mémo. Dans les deux cas, le résultat devient la nouvelle valeur pour le mémo. A la fin de l'itération, la valeur finale du mémo est la valeur de retour de la méthode.