【发布时间】:2013-03-03 07:48:31
【问题描述】:
我在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>'
在上面的代码中,您可以看到 x 局部变量已创建,尽管它仅在虚假的 if 块中分配。我试图用p x 查看x 的内容,这迫使我相信分配没有完成,但x 变量存在。 x.object_id也证明是这样的。
现在我的问题是 x 局部变量是如何创建的,即使 if 块入口点被有意永久关闭?
我希望p x 的输出与p y 的输出相似。但相反,我从p x 得到了一个令人惊讶的答案。
有人可以向我解释一下这个概念是如何工作的吗?
编辑
不,这是另一个测试。只有local 变量不是这种情况。 instance 和 class 变量也发生了同样的情况。见下文:
class Foo
def show
@X = 10 if false
p @X,"hi",@X.object_id
end
end
#=> nil
Foo.new.show
nil
"hi"
4
#=> [nil, "hi", 4]
class Foo
def self.show
@@X = 10 if false
p @@X,"hi",@@X.object_id
end
end
#=> nil
Foo.show
nil
"hi"
4
#=> [nil, "hi", 4]
成功案例:
class Foo
def self.show
@@X = 10 if true
p @@X,"hi",@@X.object_id
end
end
#=> nil
Foo.show
10
"hi"
4
#=> [10, "hi", 4]
【问题讨论】:
标签: ruby if-statement nameerror