我在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即使仅在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 = 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]
慕无忌1623718
12345678_0001
相关分类