Определим функцию 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
во втором случае.
Вот еще один пример:
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.)