Melhorando o “try()” do Ruby, a maneira “Groovy” :D

Bom, desta vez não vou traduzir o meu post, então deem uma olhadinha no meu blog em ingles: A better “try()” for Ruby, why not do the Groovy way?

Mas um resumo rápido:
Acho que todos concordam que é bem chato nas views por exemplo em uma aplicação Ruby escrever:

<%= @person.name if @person %>

Fazer isto um monte de vezes, ou usar o operador ternario, começa a ficar chato com o tempo …
então algumas pessoas sugeriram utilizar:

<%= @person.try(:name) %>

Eu acho que isto fica mais estranho do que o if.
Então resolvi escrever este post: A better “try()” for Ruby, why not do the Groovy way?

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

10 comments so far

  1. Tiago Peczenyj March 5, 2008 3:14 pm

    class Omega
    def doIt
    puts “ola”
    self
    end
    end

    class NullableClass
    def method_missing(*x)
    self
    end
    end

    class Object
    def has?
    self
    end
    end

    class NilClass
    def has?
    NullableClass.new
    end
    end

    xyz = Omega.new
    xyz . has? . doIt . doIt

    abc = nil
    abc . has? . doIt . doIt

  2. Urubatan March 5, 2008 3:20 pm

    legal, mas não entendi muito bem qual a vantagem disto :D

  3. Tiago Peczenyj March 5, 2008 3:23 pm

    Vantagem: o .has? é quase o ? do groovy e eu não preciso alterar o nome dos meus métodos originais.

    Todo o objeto nil não vai fazer nada a partir desse método :)

  4. Tiago Peczenyj March 5, 2008 3:24 pm

    talvez fosse melhor utilizar outro nome, não algo como
    se_nao_existir_nao_faz_nada

  5. Urubatan March 5, 2008 3:31 pm

    verdade, não tinha prestado atenção …
    ficou legal também :D

  6. Urubatan March 5, 2008 3:33 pm

    a única coisa que não gostei desta abordagem é que fica estranho digitar:

    @person.has?.company.has?.manager.has?.name

    fica muito .has? espalhado, achei o _ no final do metodo mais limpo :D

  7. Tiago Peczenyj March 5, 2008 3:41 pm

    Não precisa… vc pode fazer com um has? apenas, faça o teste.

  8. Urubatan March 5, 2008 4:02 pm

    não funciona apenas com um has? o primeiro has, vale para @person, mas se @person não for nil mas @person.company for, o has? não vai ter efeito nenhum

  9. Bruno March 6, 2008 2:07 pm

    O captcha do seu blog em ingles não ta funcionando =) Aqui vai o comentário que eu tentei deixar lá.

    “The method call after the “?” is only called if the previous expression was not nil. I could not think in a way to implement any thing like that in ruby, but I think I came out with a satisfactory solution.”

    I don’t see the “try(:method)” as a “clean” solution, too. But, unfortunately, “:?” isn’t a valid ruby symbol. So, I guess, we can’t define a “?” method. What about this solution?

    class MyProxy
    def initialize(object)
    @object = object
    end

    def method_missing(methodname, *args)
    if @object.respond_to? methodname
    @object.send(methodname,*args)
    end
    end
    end

    class Object
    def e?
    return MyProxy.new(self)
    end
    end

    x = nil
    x.e?.name
    x = Struct.new(:name)
    x.e?.name

    (Yeah, I know, there are better ways to implement a proxy object in ruby. And there are more methods that need to be overwritten, like “object_id” and “class”. And that “e?” isn’t the better method name of all times. But this is a simple proof of concept =D)

  10. Renan March 8, 2008 5:32 pm

    Urubatan, off-topic:
    o que usa(plugin) em seu blog para inserir códigos(jsp, ruby, java, etc) em seus posts?

    Obrigado!

Leave a comment

Please be polite and on topic. Your e-mail will never be published.