yield

Os métodos Ruby podem ser fornecidos opcionalmente como um bloco na invocação. Este bloco pode ser opcionalmente disponibilizado como um objeto Proc que usa o prefixo & no parâmetro final de um método, mas que permanece invocável a todo momento através da palavra-chave do campo.

A palavra-chave do campo se parece sintaticamente a uma chamada de método no objeto atual. Adota uma lista de parâmetros exatamente como as chamadas de método e retorna um valor.

 yield(1, 2)
 yield 3
 x = yield(4)

Mesmo se o argumento do bloco estiver nomeado em um método, o código no qual o método ainda pode invocar o bloco que usa yield, em vez de chamar o objeto Proc.

 def both_ways(&block)
   block.call(1)
   yield(1)
 end

No entanto, estas duas formas não são idênticas. Por exemplo, as redefinições de Proc#call afetarão a primeira invocação, mas não a segunda.

Parecido a como os blocos são nomeados e capturados como objetos Proc em um método, os Procs também podem ser inseridos no slot do bloco no momento da chamada do método usando o prefixo & no último argumento da chamada.

 def only_uses_yield
   yield
 end
 
 a_proc = proc{ puts "chamado" }
 only_uses_yield(&a_proc)