В этом простом примере вам фактически не требуется явно передавать блок:
def each
@array.each{|e| yield e}
end
Передача блока (который является объектом Proc ) явно позволяет вам проверить его на такие вещи, как количество ожидаемых аргументов:
class Box
...
def each(&block)
@array.each do |e|
case block.arity
when 0
yield
when 1
yield e
when 2
yield e, :baz
else
yield
end
end
end
end
a = Box.new
a.each { puts "nothing" } # displays "nothing, nothing"
a.each { |e| puts e } # displays "foo, bar"
a.each { |e1, e2| puts "#{e1} #{e2}" } # displays "foo baz, bar baz"