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)