Rinaldi Fonseca

2 situações para utilizar o método try no Rails

29 de abril de 2011

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 »

  1. Muito boa a dica. Obrigado!

    Comentário por Erich Kist — 2 de maio de 2011 @ 12:08

  2. Ó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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

Feed RSS dos comentários deste post URL de TrackBack

Deixe um comentário

Spam protection by WP Captcha-Free