Rubyのローカル変数初期化ルール
初期化されていないローカル変数を参照すると、NameErrorが発生します。
例えば、以下のコードを実行すると
def method(i) p a end method(-1)
ローカル変数aは初期化されていないので、NameErrorになります。
local_init_1.rb:2:in `method': undefined local variable or method `a' for main:Object (NameError) from local_init_1.rb:4:in `<main>'
しかし、参照よりも前に代入文があると、たとえその代入文を通らなくても、nilに初期化されます。
def method(i) if i > 0 then p "pass" a = "hello" end p a end method(-1)
実行結果は以下です。ローカル変数aへの代入文は通りませんが、nilに初期化されるため、NameErrorは発生しません。
nil