【发布时间】:2013-09-17 20:42:33
【问题描述】:
This post 关于元类及其在 Ruby 对象模型中的位置有一个类层次图。其中Class:Class(Class的单例类)是它自己的一个实例,但我认为它应该是Class的一个实例。换句话说,如果我们有对象class_singletonclass如下:
class_singletonclass = Class.singleton_class
# => #<Class:Class>
它的内部类指针klass 指向哪里?在Class的情况下klass指向哪里,假设我们为Class定义了一个类方法(单例方法)?
我意识到Class 已经定义了类方法。我猜Class 很特别,并且在 MRI 中有自己的 C 实现,因此添加类方法将创建一个适当的元类。这个假设是错误的吗?
我在 MRI 中的 class.c 中发现了以下内容:
/*!
* 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,这适用于所有元类。
【问题讨论】:
-
可能值得制作自己的图表版本。我对您的问题的理解是“元类
<Class>(蓝色)上的环回虚线(代表instance of)实际上不应循环到自身,而应指向普通Class(绿色),对吗?” - 我几乎不明白这一点,这无济于事,但我目前在浏览您的问题时遇到了一些问题。 -
是的,这就是我想说的。对不起,如果我的措辞太混乱了。
-
它试图解开令人困惑的“类”这个词的许多区别。我认为要清楚地写出这个主题需要付出巨大的努力。
标签: ruby metaprogramming