gpt4 book ai didi

ruby - 可以枚举特征类吗?

转载 作者:数据小太阳 更新时间:2023-10-29 08:04:30 24 4
gpt4 key购买 nike

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

有什么方法可以枚举系统中活跃的特征类吗?

最佳答案

查看 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 方法返回。

关于ruby - 可以枚举特征类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19868710/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com