関数fooを定義します。
def foo(s)
case s
when'foo'
x = 3
puts x.inspect
when 'bar'
y = 4
puts y.inspect
end
puts x.inspect
puts y.inspect
end
次に、それを次のように呼びます。
1.9.3p194 :017 > foo('foo')
in foo scope
3
in outer scope
3
nil
=> nil
1.9.3p194 :018 > foo('bar')
in bar scope
3
in outer scope
nil
3
=> nil
どちらの場合でも、関数が未登録のローカル変数に関するエラーをスローしないのはなぜですか?最初のケースでは、変数y
は存在してはならないように見えるためinspect
、外部スコープで呼び出すことはできません。x
2番目の場合も同じです。
別の同様の例を次に示します。
def test1
x = 5 if false
puts x.inspect
end
def test2
puts x.inspect
end
その後:
1.9.3p194 :028 > test1
nil
=> nil
1.9.3p194 :029 > test2
NameError: undefined local variable or method `x' for main:Object
何が起きてる?Rubyが変数宣言を外部スコープに引き上げているように見えますが、これがRubyが行っていることであることに気づいていませんでした。(「ルビー巻き上げ」を検索すると、JavaScript巻き上げに関する結果のみが表示されます。)