我是红宝石的新手。我已经了解了ruby的单例类概念,但是我有一个问题,就是ruby在什么时候为对象创建了单例类。我的意思是当对象定义自己的方法(不在其祖先类或超类中)或在运行时创建对象时。我对这个概念很清楚,当一个类或对象将方法定义为它们自己的方法时,在该对象与其类之间插入一个匿名类,称为“单身类”。但是看看这个线程,类变量和类实例变量之间的区别?在栏杆回答中,他使用了类似
hello.singleton_class.class_variable_get(:@@class_var)
hello是Hello
具有类变量的类的对象@@class_var
。为什么我们必须在其中使用'singleton_class'
hello.singleton_class.class_variable_get(:@@class_var)
在类中定义类变量时,是否还会插入单例类?
如果看一下源代码,singleton_class
您会发现它只是转发到C函数rb_singleton_class
(至少对MRI有用)。如果您进一步深入研究,您会发现一些C代码,这些代码基本上可以归结为针对特殊情况的一系列复杂测试,然后,如果一切顺利,则将创建singleton类。
从概念上讲,singleton_class
顾名思义就是一个单例Class
对象。由于每个行为良好的单例都将在首次访问时创建。之所以发生这种情况,是因为您定义了单例方法,或者因为singleton_class
显式访问完全取决于您的程序。对于大多数对象,永远不会调用它singleton_class
,因此Class
根本不会创建该对象。如果不是这种情况,几乎就不值得由singleton
机械师引起的开销。
我认为您引用的答案的作者只是想举例说明访问@@class_var
类变量的不同可能性。因为class_variable_get
是类的一种方法,所以Class
他将需要该类的实例,并且由于单例类是从常规父类隐式派生的,因此可以使用它。在示例中,他可能还会使用
hello.class.class_variable_get(:@@class_var)
达到同样的效果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句