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