在 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
我试图获取特殊类(eigenclasses),因为我想列出在脚本中定义的所有方法。我可以查找模块和类定义的所有实例方法,然后查找模块和类的单例方法(或所有对象的单例方法,如果我想要消耗 CPU),但这似乎有点 hackish。