能枚举本征类吗?

时间:2013-11-08 21:22:06

标签: ruby eigenclass objectspace

调用ObjectSpace.each_object(Class)似乎没有返回任何特征类。例如,在调查Ruby metaclasses: why three when defined singleton methods?时,我发现虽然在使用类方法定义新类的情况下ObjectSpace.count_objects[:T_CLASS]增加了3,但ObjectSpace.each_object(Class).count仅增加1。

有没有办法枚举系统中活动的本征类?

1 个答案:

答案 0 :(得分:2)

查看MRI C代码,函数ObjectSpace.each_object测试对象是否为内部对象,如果为真,则从迭代器中删除对象。

测试由以下函数完成,该函数将内部标记为singleton的类视为内部对象:

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模块不同。

如果您创建一个类并在其上包含Singleton模块,它将由ObjectSpace.each_object方法返回。