Un bloque puede llamarse de forma recursiva siempre que esté almacenado en una variable a la que pueda acceder el bloque. Por ejemplo:
def f(x)
block = lambda do |y|
# some calculation on value, or simply yield to the block passed to f()
yield y
block.call(y - 1) if y > 0
end
block.call(x)
end
f(4) do |x|
puts "Yielded block: #{x}"
end
Alternativamente, puede volver al bloque recursiva, con destino a las personas que llaman bloquear y luego llamar a ese bloque. Por ejemplo:
def g
block = lambda do |y|
# some calculation on value, or simply yield to block passed to g()
yield y
block.call(y - 1) if y > 0
end
end
printing_descender = g do |x|
puts "Encapsulated block: #{x}"
end
printing_descender.call(4)
Salidas:
Yielded block: 4
Yielded block: 3
Yielded block: 2
Yielded block: 1
Yielded block: 0
Encapsulated block: 4
Encapsulated block: 3
Encapsulated block: 2
Encapsulated block: 1
Encapsulated block: 0
Debo agregar que las instancias recursivas todavía deberían tener el bloque asociado, en caso de que no fuera obvio. – DigitalRoss