gpt4 book ai didi

ruby - 为什么对象在迭代内部和外部不同?

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

我将一个类分配给常量 Foo,并将 Foo 重新分配给其他东西:

class Foo; end
Foo = nil

main环境中,Foo指的是新分配的对象:

p Foo # => nil

但是,在某种迭代中(我不确定是哪一个),Foo 指的是前一个对象:

ObjectSpace.each_object(Class).select{|c| c.name == "Foo"}
.each{|c| p c, c.instance_of?(Class)}
# => Foo
true

这是为什么?

最佳答案

nil 赋值给常量 Foo 不会影响创建的类。它仍然存在,尽管您不能再使用 Foo 引用它(除非您再次将类对象重新分配给 Foo)。

class Foo; end
Foo.object_id
# => 70210590718440
Foo = nil
Foo.object_id
# => 4
Foo = ObjectSpace._id2ref(70210590718440)
Foo.object_id
# => 70210590718440

关于 name,创建一个类:

class Foo; end
Foo.name
# => "Foo"

将其分配给常量 Foo,就像:

Foo = Class.new
Foo.name
# => "Foo"

它还设置了它的名称,但这并没有使它成为一个类。您也可以创建没有名称的类:

foo = Class.new
foo.name
# => nil

将未命名的类分配给常量设置其名称:

Bar = foo
foo.name
# => "Bar"

一旦设置,它就不会改变:

Baz = foo
foo.name
# => "Bar"

关于ruby - 为什么对象在迭代内部和外部不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16525524/

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