Putting a &
(ampersand) in front of an argument will pass it as the method’s block. Objects will be converted to a Proc
using the to_proc
method.
class Greeter
def to_proc
Proc.new do |item|
puts "Hello, #{item}"
end
end
end
greet = Greeter.new
%w(world life).each(&greet)
This is a common pattern in Ruby and many standard classes provide it.
For example, [Symbol](<http://ruby-doc.org/core/Symbol.html>)
s implement to_proc
by sending themselves to the argument:
# Example implementation
class Symbol
def to_proc
Proc.new do |receiver|
receiver.send self
end
end
end
This enables the useful &:symbol
idiom, commonly used with [Enumerable](<http://ruby-doc.org/core/Enumerable.html>)
objects:
letter_counts = %w(just some words).map(&:length) # [4, 4, 5]