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!



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
legal, mas não entendi muito bem qual a vantagem disto
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
talvez fosse melhor utilizar outro nome, não algo como
se_nao_existir_nao_faz_nada
verdade, não tinha prestado atenção …
ficou legal também
a única coisa que não gostei desta abordagem é que fica estranho digitar:
fica muito .has? espalhado, achei o _ no final do metodo mais limpo
Não precisa… vc pode fazer com um has? apenas, faça o teste.
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
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)
Urubatan, off-topic:
o que usa(plugin) em seu blog para inserir códigos(jsp, ruby, java, etc) em seus posts?
Obrigado!