# Module A extends Moudle B possible?

**URL:** <https://www.ruby-forum.com/t/module-a-extends-moudle-b-possible/185579>\
**Category:** Ruby\
**Created:** [March 23, 2010, 3:11am UTC](https://www.ruby-forum.com/t/module-a-extends-moudle-b-possible/185579 "2010-03-23T03:11:22Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![smarter](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/9fc29f/32.png) [@smarter](https://www.ruby-forum.com/u/smarter)\
**Post date:** [March 23, 2010, 3:11am UTC](https://www.ruby-forum.com/t/module-a-extends-moudle-b-possible/185579/1 "2010-03-23T03:11:22Z")

</div>

Hello:

Can Modules extends within themselves?

Like Class A \< B is Valid, where B is another class  
Module X \< Y is invalid, where Y is another module?

Thanks.

---

<div class="post-metadata">

**Author:** ![smarter](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/9fc29f/32.png) [@smarter](https://www.ruby-forum.com/u/smarter)\
**Post date:** [March 23, 2010, 10:58pm UTC](https://www.ruby-forum.com/t/module-a-extends-moudle-b-possible/185579/2 "2010-03-23T22:58:02Z")

</div>

On 03/23/2010 03:11 AM, Smart RoR wrote:

> Can Modules extends within themselves?
> 
> Like Class A \< B is Valid, where B is another class  
> Module X \< Y is invalid, where Y is another module?

Not directly. But you can use #included like this:

irb(main):001:0\> module A; end  
=\> nil  
irb(main):002:0\> module B  
irb(main):003:1\> def self.included(cl)  
irb(main):004:2\> cl.class\_eval { include A }  
irb(main):005:2\> end  
irb(main):006:1\> end  
=\> nil  
irb(main):007:0\> class X  
irb(main):008:1\> include B  
irb(main):009:1\> end  
=\> X  
irb(main):010:0\> X.ancestors  
=\> [X, A, B, Object, Kernel, BasicObject]  
irb(main):011:0\>

Note however that the inheritance order is reversed. There are a number  
of other ways to achieve what you want. The requirement does not seem  
to come up very frequently though. So maybe it’s not an issue as big as  
you think.

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![smarter](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/9fc29f/32.png) [@smarter](https://www.ruby-forum.com/u/smarter)\
**Post date:** [March 23, 2010, 11:00pm UTC](https://www.ruby-forum.com/t/module-a-extends-moudle-b-possible/185579/3 "2010-03-23T23:00:25Z")

</div>

Thanks robert.

---

<div class="post-metadata">

**Author:** ![smarter](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/9fc29f/32.png) [@smarter](https://www.ruby-forum.com/u/smarter)\
**Post date:** [March 23, 2010, 11:46pm UTC](https://www.ruby-forum.com/t/module-a-extends-moudle-b-possible/185579/4 "2010-03-23T23:46:36Z")

</div>

On 3/23/10, Robert K. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> irb(main):002:0\> module B  
> =\> [X, A, B, Object, Kernel, BasicObject]  
> irb(main):011:0\>
> 
> Note however that the inheritance order is reversed. There are a number  
> of other ways to achieve what you want. The requirement does not seem  
> to come up very frequently though. So maybe it’s not an issue as big as  
> you think.

Am I missing something? Why not just include A from B? Like this:

irb(main):001:0\> module A; end  
=\> nil  
irb(main):002:0\> module B include A end  
=\> B  
irb(main):003:0\> class X  
irb(main):004:1\> include B  
irb(main):005:1\> end  
=\> X  
irb(main):006:0\> X.ancestors  
=\> [X, B, A, Object, Kernel]  
irb(main):007:0\>

---

<div class="post-metadata">

**Author:** ![smarter](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/9fc29f/32.png) [@smarter](https://www.ruby-forum.com/u/smarter)\
**Post date:** [March 24, 2010, 12:43am UTC](https://www.ruby-forum.com/t/module-a-extends-moudle-b-possible/185579/5 "2010-03-24T00:43:22Z")

</div>

On 3/23/10, Smart RoR [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> In the end, I wanted to see A as ancestor of B.  
> No classes, only modules.

So, then, you should use include, I think. It’s like inheiritance, but  
for modules:

module A;end  
module B include A end  
B.ancestors #=\> [B, A]

---

<div class="post-metadata">

**Author:** ![smarter](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/9fc29f/32.png) [@smarter](https://www.ruby-forum.com/u/smarter)\
**Post date:** [March 24, 2010, 12:03am UTC](https://www.ruby-forum.com/t/module-a-extends-moudle-b-possible/185579/6 "2010-03-24T00:03:42Z")

</div>

In the end, I wanted to see A as ancestor of B.  
No classes, only modules.

---

<div class="post-metadata">

**Author:** ![smarter](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/9fc29f/32.png) [@smarter](https://www.ruby-forum.com/u/smarter)\
**Post date:** [March 24, 2010, 9:38am UTC](https://www.ruby-forum.com/t/module-a-extends-moudle-b-possible/185579/7 "2010-03-24T09:38:54Z")

</div>

2010/3/23 Caleb C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Am I missing something? Why not just include A from B? Like this:

_I_ am the one missing something. I had this nagging feeling that  
there must be a simpler way but apparently I was too tired to take it  
seriously. Thanks for the correction!

Kind regards

robert
