我们定义一个函数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
Run Code Online (Sandbox Code Playgroud)
然后我们将其称为如下:
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
Run Code Online (Sandbox Code Playgroud)
为什么函数不会在任何一种情况下抛出关于未注册的局部变量的错误?在第一种情况下,变量y似乎不应该存在,所以你不能inspect在外部范围内调用它; 同为x在第二种情况下.
这是另一个类似的例子:
def test1
x = 5 if false
puts x.inspect
end
def test2
puts x.inspect
end
Run Code Online (Sandbox Code Playgroud)
然后: …
我正在玩if积木中的任务操作,并发现了以下结果,这让我感到惊讶:
C:\>irb --simple-prompt
if false
x = 10
end
#=> nil
p x
nil
x.object_id
#=> 4
#=> nil
p y
NameError: undefined local variable or method `y' for main:Object
from (irb):5
from C:/Ruby193/bin/irb:12:in `<main>'
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,您可以看到x已创建局部变量,即使它仅被分配给falsy if块.我想看到的内容x与p x这迫使我相信,分配却没有这样做,而是x变量存在.x.object_id也证明了这种情况.
现在我的问题是如何x创建局部变量,即使if块入口点是故意关闭的?
我期望输出p x类似于输出p y.但相反,我得到了一个惊人的答案p x.
有人可以向我解释这个概念是如何运作的吗?
编辑
不,这是另一个测试.仅local变量不是这种情况.同样的事情instance和class变量也发生了.见下文:
class Foo
def show
@X …Run Code Online (Sandbox Code Playgroud)