2013-04-06 2 views
3

Есть ли способ получить список всех определенных классов. Я ищу для кода:Как я могу получить все определенные классы?

Class.instances.each do |klass| 
    puts klass.name 
end 

Если нет никакого способа сделать это. Можно определить класс А так, чтобы его потомки регистрировались в нем? Например, таким образом:

class A 
    ... 
end 

class B < A 
end 

class C < B 
end 

A.descendants # => [B, C] 

ответ

1
p ObjectSpace.each_object(Class){|ob| p ob} 
+0

Ваше первое решение не будет работать, так как 'constants' возвращает массив символов, а не фактические константы. –

+0

Я знаю, что делает 'константы', но вам это не кажется. 'Object.constants.grep (класс) .empty? # => true', поэтому ваш 'каждый' бесполезен. –

+0

'ob' будет * never * быть экземпляром класса. Это означает, что вы включаете вещи, которые не являются классами в вашем списке, поскольку вы никогда не фильтруете их. Я не пытаюсь быть грубым, но вы указываете мне документацию, которая показывает, что то, что вы делаете, не работает так, как вы ожидаете. –

3

ObjectSpace может помочь вам получить все экземпляры класса. Это, таким образом, возвращает все определенные классы

ObjectSpace.each_object(Class) 
+2

Он также будет возвращать классы, которые когда-то были определены, но не более, но еще не были собраны мусором. –

2

В дополнение к ObjectSpace, умный метод крюков вы можете определить это inherited, что рубин будет вызывать каждый раз, когда его класс на подклассы.

class A 
    @sub_classes = [] 

    def self.inherited(sub_class) 
    @sub_classes << sub_class 
    end 
end 
Смежные вопросы