#3

Hoje eu aprendi uma coisa nova sobre Ruby. As variáveis locais são avaliadas e alocadas pré-runtime. Isso resulta em algo do tipo:

irb(main):001:1* if false
irb(main):002:1*   x = 'foo'
irb(main):003:0> end
=> nil
irb(main):004:0> puts x
=> nil
irb(main):005:0> puts y
[...]
NameError (undefined local variable or method `y' for main:Object)

Ou seja, mesmo que a atribuição x = 'foo' nunca aconteça, a variável x existe em tempo de execução com o valor nil. Já no caso de uma variável que nunca foi referenciada, NameError acontece como esperado.

Mesmo usando Ruby profissionalmente há algum tempo, de vez em quando me deparo com esse tipo de coisa. Nesse caso em específico, a descoberta veio através do livro The Well-Grounded Rubyist.