加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 为什么迭代内部和外部的对象不同?

发布时间:2020-12-17 02:45:22 所属栏目:百科 来源:网络整理
导读:我将一个类分配给一个常量Foo,并将Foo重新分配给其他东西: class Foo; endFoo = nil 在主环境中,Foo引用新分配的对象: p Foo # = nil 但是,在某种迭代中,(我不确定是哪种),Foo引用了前一个对象: ObjectSpace.each_object(Class).select{|c| c.name == "Fo
我将一个类分配给一个常量Foo,并将Foo重新分配给其他东西:

class Foo; end
Foo = nil

在主环境中,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

关于名称,创建一个类:

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"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读