gpt4 book ai didi

ruby - 为什么单例类是它自己的一个实例?

转载 作者:太空宇宙 更新时间:2023-11-03 16:40:23 25 4
gpt4 key购买 nike

这个问题很难说。所有对象都有一个单例类(也称为幽灵类),我们可以在该类上仅为该对象定义方法。

但是当我们检查单例类时,我们看到它是一个类的实例,这两个类都是同一个对象。

o = Object.new
o.singleton_class.instance_eval { self.object_id } # => 47082984969880
o.singleton_class.class_eval { self.object_id } # => 47082984969880

这是因为单例类是匿名类。

o.singleton_class # => #<Class:#<Object:0x0000557ed623d8b8>>
o.singleton_class.name # => nil

匿名类是 Class 类型的类

o.singleton_class.class # => Class

Class的类是Class:

Class.class # => Class
Class.new.class == Class # => true

Class 是其自身的一个实例。

由此可见单例类是一个Class类型的匿名类,它们是Class的同一个实例

Class.object_id # => 47001622014720
o.singleton_class.class.object_id # => 47001622014720

但是为什么使用 class_evalinstance_eval 我们得到了相同的对象,但是在没有 eval 的情况下查看实例和类我们却没有?

o.singleton_class.instance_eval { self.object_id } # => 47082984969880
o.singleton_class.class_eval { self.object_id } # => 47082984969880
o.singleton_class.object_id # => 47082984969880
o.singleton_class.class.object_id # => 47001622014720

最佳答案

从 o.singleton_class.class.object_id 得到 47001622014720 的地方实际上与 Class.object_id 相同,它也应该产生 47001622014720。

更进一步,尝试使用 ancestors 而不是 object_id,看看您是否可以更深入地了解正在发生的事情。

o.singleton_class.instance_eval { self.ancestors } # => [#<Class:#<Object:0x00007f9b3c0465d0>>, Object, Kernel, BasicObject]
o.singleton_class.class_eval { self.ancestors } # => [#<Class:#<Object:0x00007f9b3c0465d0>>, Object, Kernel, BasicObject]
o.singleton_class.ancestors # => [#<Class:#<Object:0x00007f9b3c0465d0>>, Object, Kernel, BasicObject]
o.singleton_class.class.ancestors # => [Class, Module, Object, Kernel, BasicObject]

关于ruby - 为什么单例类是它自己的一个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58189718/

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