这篇关于元类及其在 Ruby 对象模型中的位置的文章有一个类层次结构图。在其中,Class:Class
(Class
的单例类) 是其自身的一个实例,但我认为它应该是Class
. 换句话说,如果我们有class_singletonclass
如下对象:
class_singletonclass = Class.singleton_class
# => #<Class:Class>
它的内部类指针klass
指向哪里?klass
在 的情况下指向哪里Class
,假设我们为 定义了一个类方法(单例方法)Class
?
我意识到Class
已经定义了类方法。我想这Class
很特别,并且在 MRI 中有自己的 C 实现,因此添加类方法将创建一个适当的元类。这个假设是错误的吗?
我class.c
在 MRI 中发现了以下内容:
/*!
* A utility function that wraps class_alloc.
*
* allocates a class and initializes safely.
* \param super a class from which the new class derives.
* \return a class object.
* \pre \a super must be a class.
* \post the metaclass of the new class is Class.
*/
VALUE
rb_class_boot(VALUE super)
{
VALUE klass = class_alloc(T_CLASS, rb_cClass);
RCLASS_SET_SUPER(klass, super);
RCLASS_M_TBL(klass) = st_init_numtable();
OBJ_INFECT(klass, super);
return (VALUE)klass;
}
该行\post the metaclass of the new class is Class.
表明Class
' 的元类确实是,Class
这适用于所有元类。