# Is there a way to know what are the subclasses of a given class?

**URL:** <https://www.ruby-forum.com/t/is-there-a-way-to-know-what-are-the-subclasses-of-a-given-class/153603>\
**Category:** Ruby\
**Created:** [November 19, 2008, 10:12am UTC](https://www.ruby-forum.com/t/is-there-a-way-to-know-what-are-the-subclasses-of-a-given-class/153603 "2008-11-19T10:12:07Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![sandro\_p](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/3be4f8/32.png) [@sandro\_p](https://www.ruby-forum.com/u/sandro_p)\
**Post date:** [November 19, 2008, 10:12am UTC](https://www.ruby-forum.com/t/is-there-a-way-to-know-what-are-the-subclasses-of-a-given-class/153603/1 "2008-11-19T10:12:07Z")

</div>

Hello

Do you know if there’s a trick to retrieve a list of all the subclasses  
of a  
given class ?

class A  
class B  
end  
class C  
end  
end

like A.subclasses --\> [B,C] ?

Thanks  
Sandro

---

<div class="post-metadata">

**Author:** ![sandro\_p](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/3be4f8/32.png) [@sandro\_p](https://www.ruby-forum.com/u/sandro_p)\
**Post date:** [November 19, 2008, 10:15am UTC](https://www.ruby-forum.com/t/is-there-a-way-to-know-what-are-the-subclasses-of-a-given-class/153603/2 "2008-11-19T10:15:03Z")

</div>

[SOLVED]

I just find out that you can call:

A.constants --\> [“B”,“C”]

Thank you

Sandro

On Wed, Nov 19, 2008 at 10:10 AM, Sandro P. \<

---

<div class="post-metadata">

**Author:** ![sandro\_p](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/3be4f8/32.png) [@sandro\_p](https://www.ruby-forum.com/u/sandro_p)\
**Post date:** [November 19, 2008, 10:53am UTC](https://www.ruby-forum.com/t/is-there-a-way-to-know-what-are-the-subclasses-of-a-given-class/153603/3 "2008-11-19T10:53:11Z")

</div>

In your above example, B is not subclass of A (B is not even defined,  
just A::B).

Also, how about

class A  
class B  
end  
class C  
end  
D = E = F = 5  
end

> > A.constants  
> > =\> [“C”, “B”, “D”, “F”, “E”]

What are you trying to do exactly? Maybe modules would be better?

Cheers,  
Peter

* * *

[http://www.rubyrailways.com](http://www.rubyrailways.com)  
[http://scrubyt.org](http://scrubyt.org)

---

<div class="post-metadata">

**Author:** ![sandro\_p](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/3be4f8/32.png) [@sandro\_p](https://www.ruby-forum.com/u/sandro_p)\
**Post date:** [November 19, 2008, 10:58am UTC](https://www.ruby-forum.com/t/is-there-a-way-to-know-what-are-the-subclasses-of-a-given-class/153603/4 "2008-11-19T10:58:58Z")

</div>

Sandro P. wrote:

> Do you know if there’s a trick to retrieve a list of all the subclasses  
> of a  
> given class ?

Only this that I know of:

class A; end  
class B\<A; end

require ‘enumerator’  
p ObjectSpace.to\_enum(:each\_object, Class).  
select { |c| c.superclass == A }

---

<div class="post-metadata">

**Author:** ![sandro\_p](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/3be4f8/32.png) [@sandro\_p](https://www.ruby-forum.com/u/sandro_p)\
**Post date:** [November 19, 2008, 11:17am UTC](https://www.ruby-forum.com/t/is-there-a-way-to-know-what-are-the-subclasses-of-a-given-class/153603/5 "2008-11-19T11:17:17Z")

</div>

> > Sandro
> > 
> > > class A  
> > > class B  
> > > end  
> > > class C  
> > > end  
> > > end
> > > 
> > > like A.subclasses --\> [B,C] ?

As has been mentioned, in your example B and C are not subclasses of A.  
If you want to list all subclasses of a class you can do this:

irb(main):001:0\> class A  
irb(main):002:1\> class \<\< self  
irb(main):003:2\> attr\_accessor :subclasses  
irb(main):004:2\> end  
irb(main):005:1\> def self.inherited child  
irb(main):006:2\> (A.subclasses ||= []) \<\< child  
irb(main):007:2\> end  
irb(main):008:1\> end  
=\> nil  
irb(main):009:0\> A.subclasses  
=\> nil  
irb(main):010:0\> class B \< A; end;  
irb(main):011:0\* A.subclasses  
=\> [B]  
irb(main):012:0\> class C \< B; end;  
irb(main):013:0\* A.subclasses  
=\> [B, C]  
irb(main):014:0\> class D \< A; end;  
irb(main):015:0\* A.subclasses  
=\> [B, C, D]

Hope this helps,

Jesus.

---

<div class="post-metadata">

**Author:** ![sandro\_p](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/3be4f8/32.png) [@sandro\_p](https://www.ruby-forum.com/u/sandro_p)\
**Post date:** [November 19, 2008, 11:04am UTC](https://www.ruby-forum.com/t/is-there-a-way-to-know-what-are-the-subclasses-of-a-given-class/153603/6 "2008-11-19T11:04:23Z")

</div>

Thanks Peter 😃

That exactly what I was lloking for 🙂

---

<div class="post-metadata">

**Author:** ![sandro\_p](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/3be4f8/32.png) [@sandro\_p](https://www.ruby-forum.com/u/sandro_p)\
**Post date:** [November 19, 2008, 11:55am UTC](https://www.ruby-forum.com/t/is-there-a-way-to-know-what-are-the-subclasses-of-a-given-class/153603/7 "2008-11-19T11:55:29Z")

</div>

On Wed, Nov 19, 2008 at 11:36 AM, Michael F.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> On Wed, Nov 19, 2008 at 7:12 PM, Jesús Gabriel y Galán  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Little different style maybe:
> 
> class A  
> @subclasses = []  
> def self.inherited(into) @subclasses \<\< into end  
> def self.subclasses() @subclasses end  
> end

Yep, much cleaner :-).  
I made a mess while I was typing in irb about closing the \<\< self early,  
and forgetting to initialize the array, so that was the result. I  
probably wanted to type this:

irb(main):001:0\> class A  
irb(main):002:1\> class \<\< self  
irb(main):003:2\> attr\_reader :subclasses  
irb(main):004:2\> def inherited(child)  
irb(main):005:3\> subclasses \<\< child  
irb(main):006:3\> end  
irb(main):007:2\> end  
irb(main):008:1\> @subclasses = []  
irb(main):009:1\> end

but anyway your version is cleaner…

Jesus.

---

<div class="post-metadata">

**Author:** ![sandro\_p](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/3be4f8/32.png) [@sandro\_p](https://www.ruby-forum.com/u/sandro_p)\
**Post date:** [November 19, 2008, 11:40am UTC](https://www.ruby-forum.com/t/is-there-a-way-to-know-what-are-the-subclasses-of-a-given-class/153603/8 "2008-11-19T11:40:45Z")

</div>

On Wed, Nov 19, 2008 at 7:12 PM, JesÃºs Gabriel y GalÃ¡n  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > > Sandro
> > > 
> > > > class A
> 
> =\> nil  
> Hope this helps,
> 
> Jesus.

Little different style maybe:

class A  
@subclasses = []  
def self.inherited(into) @subclasses \<\< into end  
def self.subclasses() @subclasses end  
end

# nil

class B \< A  
end

# nil

A.subclasses

# [B]

And a slower and hacky alternative:

require ‘set’; found = Set.new; ObjectSpace.each\_object(Class){|o|  
found \<\< o if o \< A }

# 446

found

# #\<Set: {B}\>

^ manveru
