ruby创建单例类时的场景是什么

时间:2014-06-06 06:04:36

标签: ruby

我是红宝石的新手。我已经理解了ruby的单例类概念,但我有一个问题,即ruby在什么时候为对象创建单例类。我的意思是当对象定义自己的方法(不在其祖先类或超类中)或在运行时创建对象时。我清楚地认识到,当一个类或对象将方法定义为自己的方法时,在对象及其类之间插入一个匿名类,称为“单例类”。但是在栏杆回答中查看这个帖子Difference between class variables and class instance variables?他已经使用了像

这样的东西
hello.singleton_class.class_variable_get(:@@class_var)

其中hello是类Hello的对象,它具有类变量@@class_var。 为什么我们必须在

中使用'singleton_class'
hello.singleton_class.class_variable_get(:@@class_var)

在类中定义类变量时是否也会插入单例类?

1 个答案:

答案 0 :(得分:1)

如果您查看source code of singleton_class,您会发现它只是转发到C函数rb_singleton_class(至少它用于MRI)。如果你dive further进入that,你会发现一些C代码基本上可以归结为针对特殊情况的精心测试集,然后如果一切顺利的话就会创建单例类。

概念上singleton_class就是它的名字所暗示的单个Class对象。因为每个表现良好的单身人士都应该在首次访问时创建它。这是因为你定义了一个单例方法,或者因为你明确地访问singleton_class完全取决于你的程序。对于大多数对象,永远不会调用singleton_class,因此根本不会创建Class对象。如果情况不是这样,那么singleton机制引起的开销几乎不值得。

我认为您引用的答案的作者只是想说明访问@@class_var类变量的不同可能性。由于class_variable_get是类Class的方法,因此他需要该类的实例,因为单例类是从常规父类隐式派生的,所以他可以使用它。在示例中,他也可以使用

hello.class.class_variable_get(:@@class_var)

达到同样的效果。