2 situações para utilizar o método try no Rails
O método try do Rails já é um velho conhecido. Ele foi adicionado no ActiveSupport na versão 2.3.2. Porém, percebo que algumas pessoas acabam esquecendo de sua utilidade, e com isso códigos desnecessários acabam sendo escritos.
Antes de mostrar os exemplos, vamos “recordar” o funcionamento do método try:
“O método try permite-nos invocar qualquer método, sem nos preocupar com o fato do objeto receiver ser nil. Caso o objeto seja nil, a exceção NoMethodError seria lançada, mas utilizando o try isso não aconteceria. Ao invés disso, nil seria retornado.”
Situação 1)
Ao invés disso:
person = Person.find_by_name(“Rinaldi”) unless person.nil? person.age end
Poderíamos fazer isso:
person = Person.find_by_name(“Rinaldi”) person.try(:age)
Situação 2)
["a","b","c"].select{|letter| ["g","m","k"].include? letter}.last.try(:upcase)
No exemplo acima, estamos invocando o método upcase em um objeto que talvez não exista. Logo, é recomendável utilizar o try.
Se por algum motivo precisássemos utilizar o método try diretamente no Ruby poderíamos fazer a seguinte implementação:
class Object def try(method) send method if respond_to? method end end
7 Comentários »
Feed RSS dos comentários deste post URL de TrackBack

Muito boa a dica. Obrigado!
Comentário por Erich Kist — 2 de maio de 2011 @ 12:08
Ótimo post Rinaldi.
Lembrando que o Ruby 1.9 já tem o método try!
Comentário por Lucas Catón — 3 de maio de 2011 @ 23:16
Opa! Legal o post.
Lucas, fiquei curioso em ver no ruby 1.9 o método try e não achei. Vc tem certeza que tá no ruby ? Outro nome, talvez?
Abs
Comentário por Ricardo Bernardelli — 5 de julho de 2011 @ 18:41
Opa, fala Bernardelli, tudo jóia?
Cara, eu não tinha testado o método ‘try’ no Ruby 1.9, eu li em algum lugar ou alguém me falou que funcionava nativamente.
Agora fiquei curioso também e resolvi testar aqui, mas também não funcionou… será que é de outra forma?! Ou será que quem me falou viajou? heheh..
Anyway, se precisar implementar isso fora de uma app Rails, dá pra fazer assim:
class Object
def try(method)
send method if respond_to? method
end
end
Abraço!
Comentário por Lucas Catón — 5 de julho de 2011 @ 23:50
Catón,
acho que você se confundiu com o Object#tap, que o ActiveSupport implementa para versões antigas do Ruby mas o 1.9 incorporou o método a stdlib (e foi removido do AS).
A implementação ad-hoc mostrada não passa nenhum argumento para o método, melhor copiar (descaramente) o código do AS -> https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/try.rb
Comentário por Lucas Mazza — 6 de julho de 2011 @ 0:06
Oi Mazza, eu comentei isso com o pessoal aqui da empresa e me falaram a mesma coisa: “você não está confunfindo com o ‘tap’?”, hehe…
Acho que confundi mesmo…
Comentário por Lucas Catón — 6 de julho de 2011 @ 0:28
Imaginei mesmo que você tivesse confundindo com o tap, mas achei melhor conferir antes pra não achar que eu estou falando merda. heheh
Abraços!
Comentário por Ricardo Bernardelli — 6 de julho de 2011 @ 2:03