Yield

Artículo completo en ruby-doc.org

Una sentencia yield es similar a un callback en JavaScript. Defines un bloque de código y lo pasas como argumento de un método, este segundo que lo recibe lo ejecuta internamente donde quiere mediante el uso de yield. Como se verá en el ejemplo siguiente defines tu método y luego a este le envías un bloque de código que dentro ejecutas dos veces.

def twice
  yield
  yield
end

twice {puts("Hello World!")}

# Hello World!
# Hello World!

Además se le pueden pasar parámetros, si lo quisiéramos. En este segundo ejemplo como se trata de un bloque de código de varias líneas lo hacemos con do end en lugar de usar las llaves { }. Para indicarle los parámetros usamos las barras verticales | parametro |.

def names
  yield("Joe")
  yield("Sandy")
  yield("Melissa")
end

names do |name|
  puts "Hello " + name + ", how are you?"
end

# Hello Joe, how are you?  
# Hello Sandy, how are you?
# Hello Melissa, how are you?