我们定义一个函数 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 所做的事情。(搜索“ruby 提升”只会找到关于 JavaScript 提升的结果。)