【发布时间】:2011-12-10 14:36:23
【问题描述】:
在 Ruby 中获取所有模块的列表很容易:
ObjectSpace.each_object(Module).to_a
但是,是否可以获得所有特征类(也称为单例类或元类)的列表?或者特征类是不可见的?
我试过了
str = "foo"
my_metaclass = class << str; self; end
my_metaclass.class == Class # my_metaclass' class is Class
ObjectSpace.each_object(Class).include?(my_metaclass) # false
ObjectSpace.each_object.include?(my_metaclass) # still false
# Just to show each_object works
ObjectSpace.each_object(Class).include?(String) # true
我正在尝试获取特征类,因为我想列出脚本中定义的所有方法。我可以查找由模块和类定义的所有实例方法,然后查找模块和类(或所有对象,如果我想占用 CPU)的单例方法,但这似乎有点 hackish。
【问题讨论】:
-
您最终找到了答案吗?好问题;)
-
如果不对每个类调用 each_object,我就找不到方法。我确实注意到的一件事是 ObjectSpace.count_objects() :T_CLASS 计数随着每个特征类的创建而增加。那么在 C 领域有可能做到这一点吗?
-
@DanHealy:每个班级的
each_object是什么意思?如classes = ObjectSpace.each_object(Class).to_a; objects = classes.map{|klass| ObjectSpace.each_object(klass).to_a}.flatten? -
我基本上指的是您在问题中建议的方法:遍历所有对象。
-
哇哦!我喜欢这个问题。
标签: ruby reflection metaprogramming eigenclass