gpt4 book ai didi

ruby - 与伪造的 `if` block 内的赋值操作混淆

转载 作者:数据小太阳 更新时间:2023-10-29 07:42:35 25 4
gpt4 key购买 nike

<分区>

我在 if block 中进行赋值操作,发现了下面的结果,这让我很惊讶:

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 block 中分配。我试图用 p x 查看 x 的内容,这迫使我相信赋值没有完成,但是 x 变量存在。 x.object_id也证明是这样。

现在我的问题是,即使 if block 入口点被故意永久关闭,该 x 局部变量是如何创建的?

我希望 p x 的输出与 p y 的输出类似。但相反,我从 p x 那里得到了一个令人惊讶的答案。

谁能给我解释一下这个概念是如何运作的?

编辑

不,这是另一个测试。这不是只有 local 变量的情况。 instanceclass 变量也发生了同样的情况。见下文:

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]

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com