変数定義に関するルビーの奇妙な動作に出くわしました(途中でドーナツの箱を失いました):
irb(main):001:0> if false
irb(main):002:1> a = 1
irb(main):003:1> end
=> nil
irb(main):005:0> a.nil?
=> true
irb(main):006:0> b.nil?
NameError: undefined local variable or method `b' for main:Object
from (irb):6
from /Users/jlh/.rbenv/versions/2.1.5/bin/irb:11:in `<main>'
なぜa.nil?
投げていないのundefined local variable
ですか?たとえば、Python を見てみましょう (インタープリター言語と比較したかっただけです)。
>>> if False:
... a = 1
...
>>> print a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
コンパイルされた言語では、これはコンパイルさえしません。
- これは、そのコードを実行していなくても、Ruby がその変数への参照を保持しているということですか?
- もしそうなら、ifs/else は変数定義のためにどのくらい深く考えられますか?
これが Ruby で期待される動作だとは本当に信じられません。これは irb 固有のものではなく、ruby/rails コード ブロックで実行しても同じ結果が得られます。