Secrets of Proc.new

Eu estava olhando os documentos do Ruby (como todos os bons desenvolvedores fazem, certo?) E estava pensando em como alguns dos métodos poderiam ser reimplementados no próprio Ruby. Obviamente, este é apenas um exercício divertido. Mas me deparei com o loop de Kernel # e fiquei preso. Como isso pode ser implementado? Passar por um bloco é fácil. Mas que tal encaminhar? Não tão fácil.

Se a assinatura do método não aceita argumentos, como poderia ser implementada? Você não pode repassar uma chamada para yield, não pode repassar &block. O segredo é Proc.new interessante o suficiente se a mensagem for enviada sem um bloco anexado, o bloco no qual ela é chamada é convertido e enviado para o proc.

def my_loop
yield if block_given?
my_loop
(&Proc.new)
end

n
= 0

my_loop
do
break if n >= 100
n
+= 1
puts
"testing #{n}"
end

Para obter mais informações, consulte este excelente artigo- http://mudge.name/2011/01/26/passing-blocks-in-ruby-without-block.html