我正在玩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
已经创建了局部变量,即使它只是在 falsyif
块中分配。我试图查看它的内容,x
它p 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]