> 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.