调用ObjectSpace.each_object(Class)
似乎没有返回任何特征类。例如,在研究Ruby 元类时:为什么要定义三个单例方法?,我发现虽然ObjectSpace.count_objects[:T_CLASS]
在使用类方法定义新类的情况下增加了 3,但ObjectSpace.each_object(Class).count
仅增加了 1。
有没有办法枚举系统中活动的特征类?
调用ObjectSpace.each_object(Class)
似乎没有返回任何特征类。例如,在研究Ruby 元类时:为什么要定义三个单例方法?,我发现虽然ObjectSpace.count_objects[:T_CLASS]
在使用类方法定义新类的情况下增加了 3,但ObjectSpace.each_object(Class).count
仅增加了 1。
有没有办法枚举系统中活动的特征类?
查看 MRI C 代码,该函数ObjectSpace.each_object
测试对象是否为内部对象,如果为真,则将对象从迭代器中移除。
测试由以下函数进行,该函数将内部标记为单例的类视为内部对象:
static int
internal_object_p(VALUE obj)
{
RVALUE *p = (RVALUE *)obj;
if (p->as.basic.flags) {
switch (BUILTIN_TYPE(p)) {
case T_NONE:
case T_ICLASS:
case T_NODE:
case T_ZOMBIE:
break;
case T_CLASS:
if (FL_TEST(p, FL_SINGLETON)) /* Here */
break;
default:
if (!p->as.basic.klass) break;
return 0;
}
}
return 1;
}
Ruby EigenClasses 被标记为 Singleton,因此不会返回。
值得一提的是,MRI 内部使用的单例标志与标准库中的单例模块不同。
如果您创建一个类并在其上包含 Singleton 模块,它将由该ObjectSpace.each_object
方法返回。