Question
This question already has answers here :
Closed 11 years ago.
Possible Duplicate:
[What does map(&:name) mean in Ruby?](https://stackoverflow.com/questions/1217088/what-does-mapname-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?
Answer
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 &
calls to_proc
on the object, and passes it as a block to the method.
In Ruby, to_proc
is implemented on Symbol
, so that these two calls are
equivalent:
something {|i| i.foo }
something(&:foo)
So, to sum up: &
calls to_proc
on the object and passes it as a block to
the method, and Ruby implements to_proc
on Symbol
.