Lorsque vous préfixer le dernier argument d'un appel avec &
vous en indiquant clairement que vous envoyez un bloc et non un argument de normal. Ok, dans method(&:something)
, :something
est un symbole, pas un proc, alors Ruby appelle automatiquement la méthode to_proc
pour obtenir un vrai bloc. Et Rails gars (et maintenant vanillé aussi Ruby) intelligemment définis comme:
class Symbol
def to_proc
proc { |obj, *args| obj.send(self, *args) }
end
end
C'est la raison pour laquelle vous pouvez faire:
>> [1, 2, 3].map(&:to_s) # instead of [1, 2, 3].map { |n| n.to_s }
=> ["1", "2", "3"]
[modifier] Note: lorsque vous vous rendez compte que cette construction est sans sucre syntactique mais l'infrastructure générique que fournit Ruby, rien ne vous empêche d'implémenter votre propre to_proc
pour d'autres classes. Jamais senti limité parce que &:method
permis pas d'arguments?
class Array
def to_proc
proc { |obj, *args| obj.send(*(self + args)) }
end
end
>> ["1", "F", "FF"].map(&[:to_i, 16])
=> [1, 15, 255]
Ceci plus ou moins un doublon de [Understanding [ClassOne, ClassTwo] .each (&: my_method) '] (http://StackOverflow.Com/q/99318/), [Qu'est-ce que' map (&: name) 'mean dans Ruby?] (http://StackOverflow.Com/q/1217088/), [Qu'est-ce exactement est-ce dans ruby:' &: capitalize'] (http://StackOverflow.Com/q/1792683) /), [Ruby/Ruby on Rails raccourci côlon ampersand] (http://StackOverflow.Com/q/1961030/), [syntaxe Ruby: '&: symbol'] (http://StackOverflow.Com/q/2096975 /), [Qu'est-ce que ce '&: last' Ruby Construct appelé?] (Http://StackOverflow.Com/q/2211751/), ... –
... [Comment appelez-vous l'opérateur' &: ' dans Ruby?] (http://StackOverflow.Com/q/2259775/), [Que fait 'map (&: name)' dans ce code Ruby?] (http://StackOverflow.Com/q/2388337/), [Que sont ': +' et '& +' dans ruby?] (http://StackOverflow.Com/q/2697024/) et ['&: views_count' dans' Post.published.collect (&: views_count) '] (http://StackOverflow.Com/q/3888044/) . –