Um método bem interessante do rails é o returning. Apesar de ser bem simples, ele ajuda a manter seu código mais limpo e mais fácil de entender (depois de pegar costume
).
Funciona mais ou menos assim:
Dado 2 argumentos, um objeto qualquer (
arg1) e um bloco, o método repassa o objetoarg1como parâmetro do bloco e ao final da execução do bloco, retorna oarg1que pode ter sofrido alteração ou não.
Por exemplo, o seguinte método:
def published_titles(posts)
titles = {}
posts.each do |p|
titles.merge!(p.id => p.title) if p.published?
end
titles
end
Poderia ser reescrito assim:
def published_titles(posts)
returning(Hash.new) do |titles|
posts.each { |p| titles.merge!(p.id => p.title) if p.published? }
end
end
É isso.
UPDATE
O Ceolin comentou comigo hoje que o
returning seria “deprecated” no Rails 3. Isso é porque a partir do Ruby 1.9, a classe Object ganha um novo método (tap) que permite o desenvolvedor interagir em uma chamada de métodos em cadeia, por exemplo:
Users
.all .tap {|users| puts "Usuários: #{users.map(&id)}"}
.last.tap {|user| puts "Último usuário: #{user.name}"}
.posts
Então, o nosso primeiro método poderia ser escrito, no Ruby 1.9, assim:
def published_titles(posts)
Hash.new.tap do |titles|
posts.each { |p| titles.merge!(p.id => p.title) if p.published? }
end
end
Comments
Leave a comment Trackback