ksino's diary

覚えたことを忘れないように、小さなことでも書いていく。

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