Toque em {} devolver qualquer coisa

Se você é um fã do tapmétodo, provavelmente o usou para fazer atribuições compactas como esta:

def sources
@sources ||= [].tap do |s|
s
<< "source1"
s
<< "source2"
end
end

ou para fazer uma linha simples de métodos em cadeia operando e retornando o objeto original:

[1,2,3,4,5].tap{ |a| a.delete(2) }.reverse

Além disso, tappode ser útil na criação de instruções de controle de fluxo que retornam qualquer coisa que você quiser, em vez de um objeto que você bateu. Isso permite que você crie one-liners que geram novos objetos com base no original:

[1,2,3,4].tap{ |a| break a.count > 1 ? [a.first] : a }

A palavra-chave mágica aqui é break. Se você passar algum objeto para ele, o resultado de chamar a tapserá esse objeto.