> This is why if you ever want to pass a given block > to another method, you must capture it in a block argument, and also why > yielding to a block is much faster than calling a proc (since there's > less overhead in yielding than in calling a free-standing proc). def thrice() 3.times { yield } end thrice { puts "Hello World!" } # >> Hello World! # >> Hello World! # >> Hello World! That doesn't have any impact on your original argument though. You can't reimplement yield in Ruby with the reflection it offers right now.