Possible Duplicate:
What does map(&:name) mean in Ruby?
In Ruby, I know that if I do:
some_objects.each(&:foo)
It's the same as
some_objects.each { |obj| obj.foo }
That is, &:foo
creates the block { |obj| obj.foo }
, turns it into a Proc, and passes it to each. Why does this work? Is it just a Ruby special case, or is there reason why this works as it does?
Your question is wrong, so to speak. What's happening here isn't "ampersand and colon", it's "ampersand and object". The colon in this case is for the symbol. So, there's
&
and there's:foo
.The
&
callsto_proc
on the object, and passes it as a block to the method. In Rails,to_proc
is implemented onSymbol
, so that these two calls are equivalent:Also,
to_proc
onSymbol
is implemented in Ruby 1.8.7 and 1.9, so it is in fact a "ruby thing".So, to sum up:
&
callsto_proc
on the object and passes it as a block to the method, and Ruby implementsto_proc
onSymbol
.There's nothing special about the combination of the ampersand and the symbol. Here's an example that (ab)uses the regex:
Or integers.
Who needs
arr.map(&:fifth)
when you havearr.map &4
?