Executando métodos sem se preocupar com exceções no Ruby

14/07/08

Cansado de ter que verificar se um objeto existe antes de chamar algum método ou acessar um atributo?

if @object && @object.some && @object.some.fancy && @object.some.fancy.call
  # do something
else
  puts "meh. i don't like this syntax!"
end

Concordo que isto não é muito comum, mas você já deve ter feito algo como isto:

if @object && @object.respond_to?(:some_method) && @object.some_method
  # do something
end

Evite este tipo de aborrecimento trazido por estas verificações, adicionando um método como este:

def try(&block)
  raise 'No block given' unless block_given?
  yield rescue nil
end
 
if try { @objet.some.fancy.call }
  # do something
else
  puts 'hey! this call returned nil, false or threw an exception'
end

Muito mais com a cara de Ruby, não acha?

Comentários #


#1 Tino Gomes disse:
14 Jul 08, 08:50PM

Uma referência…

http://ozmm.org/posts/try.html

Abraço…

#2 Nando Vieira disse:
14 Jul 08, 09:11PM

Tino, nesta implementação ainda é preciso conhecer o escopo de onde o método será chamado. Mas é bem legal! ;)

#3 Lucas Húngaro disse:
14 Jul 08, 10:00PM

Esse try já deu o que falar há algum tempo atrás, mas acho bem legal. :)

#4 Daniel Luz disse:
14 Jul 08, 10:17PM

O problema desse tipo de técnica é que esconde um mundo de detalhes que muitas vezes não deviam ser ignorados. Numa tentativa de economizar uns caracteres para não ter que testar continuamente por nil, todas as exceções são engolidas. Testar por NoMethodError já seria genérico demais, omitir todas então…

No final das contas, eu acabo preferindo uma solução como a do Weavejester: http://weavejester.com/node/10
O uso fica um pouco mais extenso, mas a implementação é bastante simples e eficiente.

Deixe um comentário




Este blog usa o Gravatar.


Não é aceito código HTML:
adicione-o no pastie.caboo.se ou paste.milk-it.net e poste apenas o link.

Se este é seu primeiro comentário, ele terá que ser aprovado antes de ser exibido.