Module A extends Moudle B possible?

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.

···

--
Posted via http://www.ruby-forum.com/.

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

···

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?

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

Thanks robert.

···

--
Posted via http://www.ruby-forum.com/.

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>

···

On 3/23/10, Robert Klemme <shortcutter@googlemail.com> wrote:

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.

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

···

--
Posted via http://www.ruby-forum.com/.

*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

···

2010/3/23 Caleb Clausen <vikkous@gmail.com>:

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

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

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]

···

On 3/23/10, Smart RoR <deepikarohit@gmail.com> wrote:

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