Uma das características mais úteis do Ruby é a possibilidade de encadear chamadas de métodos em sequência para manipular dados, por exemplo:
[4, 1, 5, 2, 3].sort
.map { |n| n * 3 }
.select { |n| n.even? }
=> [6, 12]
Agora, usando tap
dentro do encadeamento de métodos, note como podemos agir sobre o objeto sem afetar o resultado:
[4, 1, 5, 2, 3].tap{ |n| puts "Array: #{n}" }
.sort
.map { |n| n * 3 }
.select { |n| n.even? }
=> Array: [4, 1, 5, 2, 3]
=> [6, 12]
Isso acontece porque o tap
sempre retorna o objeto no qual estamos agindo, independente se ele está sendo modificado ou não no bloco tap
. Um exemplo mais próximo de uso real desse método poderia ser:
User.new.tap do |user|
user.build_profile
user.process_credit_card
user.send_confirmation_email
end
Referências
- https://ruby-doc.org/core-2.7.0/Object.html#method-i-tap
- https://medium.com/aviabird/ruby-tap-that-method-90c8a801fd6a
- https://www.assertnotmagic.com/2017/12/29/tap-and-yield-self/