Ruby sucks: parte 42
Há algum tempo eu desisti de Ruby. Como linguagem de programação tem coisas muito legais, mas ainda é muito imatura (apesar da idade). Poderia mostrar vários exemplos de coisas estranhas em Ruby, mas hoje vai a causa de um bug que me mostraram.
Veja se o defined? não funciona de maneira não intuitiva:
lucindo@marvin:~$ irb irb(main):001:0> defined?(cu) => nil irb(main):002:0> if false irb(main):003:1> cu = "ruby" irb(main):004:1> end => nil irb(main):005:0> defined?(cu) => "local-variable" irb(main):006:0> if defined?(cu) irb(main):007:1> puts "ruby cu" irb(main):008:1> end ruby cu => nil irb(main):009:0>
Imagina se você usa isso em algo como configuração…
| Enviar por e-mail | Hits para esta publicação: 771
5 respostas para “ Ruby sucks: parte 42 ”
Deixe uma resposta.
defined? é voodoo. Já vi um comentário como esse: “At heart, the defined? keyword is something of a hack, a rather rare anomaly in Ruby’s syntax.”
“O diabo está nos detalhes” e este é o tipo de detalhe que “quebra as pernas de qualquer um” e quem tem tempo para detalhes hoje em dia:
if defined?(:bad_syntax)
ruby_sucks = true
end
unless defined?(ruby_sucks)
puts “Ruby is nice!”
else
puts “Ruby do sucks”
end
Algumas considerações:
1) Porquê você está usando defined? De que interessa se a variável foi definida ou não?
Em geral, o que interessa é o valor da variável, então você verifica se é nil ou não.
Isso vale pra arquivos de configuração também
2) defined? checa diretamente a tabela de símbolos. Isso é um detalhe de implementação, o que sugere que os casos aonde se deve usar defined? são raros.
3) Como não é método e não tem RDoc, alguns programadores olham o nome e inventam de usar sem saber o que é e como funciona e atiram no próprio pé.
Stephen,
Eu acho legal o argumento “existe mas não é para usar”… mas acontece que uma vez existindo, as pessoas usam:
http://www.google.com/codesearch?q=%22defined%3F%22+lang%3Aruby
Com CL ocorre o contrário, existe mas geralmente pouca gente usa. Quantas vezes você já implementou algo e depois “puts… e não é que já tinha pronto”
Abraços.
Que nome de variável esquisito…