Blog do Urubatan
msgbartop
Desenvolvedor, Arquiteto, Palestrante, Coordenador do RSJUG, Patinador e Blogger
msgbarbottom

05 Mar 08 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!

Tags: ,

Reader's Comments

  1. |

    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

    Reply to this comment
  2. |

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

    Reply to this comment
  3. |

    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 :)

    Reply to this comment
  4. |

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

    Reply to this comment
  5. |

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

    Reply to this comment
  6. |

    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

    Reply to this comment
  7. |

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

    Reply to this comment
  8. |

    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

    Reply to this comment
  9. |

    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)

    Reply to this comment
  10. |

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

    Obrigado!

    Reply to this comment

Leave a Comment