# Lt operator on class object, checking a class' superclasses

**URL:** <https://www.ruby-forum.com/t/lt-operator-on-class-object-checking-a-class-superclasses/192821>\
**Category:** Ruby\
**Created:** [August 6, 2010, 10:56am UTC](https://www.ruby-forum.com/t/lt-operator-on-class-object-checking-a-class-superclasses/192821 "2010-08-06T10:56:54Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![fmwr](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/9de053/32.png) [@fmwr](https://www.ruby-forum.com/u/fmwr)\
**Post date:** [August 6, 2010, 10:56am UTC](https://www.ruby-forum.com/t/lt-operator-on-class-object-checking-a-class-superclasses/192821/1 "2010-08-06T10:56:54Z")

</div>

Hi!

Do you know a good way to check whether a class is a subclass of a  
certain class (given the class object, not an instance)?

one way would be to check all of klass.superclass,  
klass.superclass.superclass till nil

or klass.new.is\_a?( cklass )

Accidentaly, I tried to such a operation:

klass \< cklass

and it seems to work, but doesn’t seem to be documented  
can somebody acknowledge this?

Best regards,  
Tomek W

---

<div class="post-metadata">

**Author:** ![fmwr](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/9de053/32.png) [@fmwr](https://www.ruby-forum.com/u/fmwr)\
**Post date:** [August 6, 2010, 11:25am UTC](https://www.ruby-forum.com/t/lt-operator-on-class-object-checking-a-class-superclasses/192821/2 "2010-08-06T11:25:46Z")

</div>

On Fri, Aug 6, 2010 at 10:57 AM, Tomasz W. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Hi!
> 
> Do you know a good way to check whether a class is a subclass of a  
> certain class (given the class object, not an instance)?
> 
> one way would be to check all of klass.superclass,  
> klass.superclass.superclass till nil
> 
> or klass.new.is\_a?( cklass )

Klass.ancestors.include?(Ancestor)

For example:

irb(main):003:0\> String.ancestors.include? Object  
=\> true

Jesus.

---

<div class="post-metadata">

**Author:** ![fmwr](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/9de053/32.png) [@fmwr](https://www.ruby-forum.com/u/fmwr)\
**Post date:** [August 6, 2010, 11:29am UTC](https://www.ruby-forum.com/t/lt-operator-on-class-object-checking-a-class-superclasses/192821/3 "2010-08-06T11:29:17Z")

</div>

-----BEGIN PGP SIGNED MESSAGE-----  
Hash: SHA1

Am 06.08.2010 10:57, schrieb Tomasz W.:

> Accidentaly, I tried to such a operation:
> 
> klass \< cklass
> 
> and it seems to work, but doesn’t seem to be documented  
> can somebody acknowledge this?
> 
> Best regards,  
> Tomek W

It is documented, although it may be a bit hard to find, since the  
behaviour is not defined in the Class class as one might expect, but in  
it’s superclass, Module. See the Module#\<, Module#\>, Module#\<= and  
Module#\>= methods on [RDoc Documentation](http://www.ruby-doc.org/ruby-1.9/index.html) . I’m  
not sure what about Module#\<=\> since the docs say it works on mixins,  
but it appears to work on classes as well.

Vale,  
Marvin  
-----BEGIN PGP SIGNATURE-----  
Version: GnuPG v1.4.10 (GNU/Linux)  
Comment: Using GnuPG with Mozilla - [http://enigmail.mozdev.org/](http://enigmail.mozdev.org/)

iEYEARECAAYFAkxb1O0ACgkQDYShvwAbcNkNmACgjN0UrOwkN3iuhovolkoXjWgM  
OWYAoIOPgogYxBm2QHGkFSvmpO181yAe  
=/E5l  
-----END PGP SIGNATURE-----

---

<div class="post-metadata">

**Author:** ![fmwr](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/9de053/32.png) [@fmwr](https://www.ruby-forum.com/u/fmwr)\
**Post date:** [August 6, 2010, 12:45pm UTC](https://www.ruby-forum.com/t/lt-operator-on-class-object-checking-a-class-superclasses/192821/4 "2010-08-06T12:45:28Z")

</div>

> It is documented, although it may be a bit hard to find, since the

I see. I got deceived by the fact that the method actually seems to be  
defined in Object.

Thanks for answers,  
best regards,  
Tomek W

---

<div class="post-metadata">

**Author:** ![fmwr](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/9de053/32.png) [@fmwr](https://www.ruby-forum.com/u/fmwr)\
**Post date:** [August 6, 2010, 12:53pm UTC](https://www.ruby-forum.com/t/lt-operator-on-class-object-checking-a-class-superclasses/192821/5 "2010-08-06T12:53:14Z")

</div>

> It is documented, although it may be a bit hard to find, since the  
> behaviour is not defined in the Class class as one might expect, but in  
> it’s superclass, Module.

What’s more ‘\<’ operator itself is defined in Object class not in  
Module.

> Module.methods - Object.methods  
> =\> [“nesting”]

So all in all one expects ‘\<’ method to be defined for Class, but it’s  
defined for Object and documented for Module. Pretty messy 😉

---

<div class="post-metadata">

**Author:** ![fmwr](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/9de053/32.png) [@fmwr](https://www.ruby-forum.com/u/fmwr)\
**Post date:** [August 6, 2010, 4:06pm UTC](https://www.ruby-forum.com/t/lt-operator-on-class-object-checking-a-class-superclasses/192821/6 "2010-08-06T16:06:55Z")

</div>

Calamitas wrote:

> 2010/8/6 MichaÅ‚ Åomnicki [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > > Module.methods - Object.methods  
> > > =\> [“nesting”]
> 
> Module.instance\_methods - Object.instance\_methods

Of course. Shame on me.

Regards,  
MichaÅ‚

---

<div class="post-metadata">

**Author:** ![fmwr](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/9de053/32.png) [@fmwr](https://www.ruby-forum.com/u/fmwr)\
**Post date:** [August 6, 2010, 3:14pm UTC](https://www.ruby-forum.com/t/lt-operator-on-class-object-checking-a-class-superclasses/192821/7 "2010-08-06T15:14:40Z")

</div>

2010/8/6 MichaÅ‚ Åomnicki [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > Module.methods - Object.methods  
> > =\> [“nesting”]

Module.instance\_methods - Object.instance\_methods  
=\> [“private\_class\_method”, “const\_missing”,  
“public\_instance\_methods”, “method\_defined?”, “included\_modules”,  
“const\_get”, “module\_eval”, “class\_variables”,  
“protected\_instance\_methods”, “public\_method\_defined?”, “const\_set”,  
“class\_eval”, “include?”, “private\_instance\_methods”,  
“private\_method\_defined?”, “name”, “autoload”, “\<”, “\<=\>”, “\>”,  
“instance\_method”, “protected\_method\_defined?”, “const\_defined?”,  
“\>=”, “ancestors”, “\<=”, “public\_class\_method”, “instance\_methods”,  
“class\_variable\_defined?”, “constants”, “autoload?”]

Peter
