From: Smart RoR on
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/.

From: Robert Klemme on
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

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/
From: Smart RoR on
Thanks robert.
--
Posted via http://www.ruby-forum.com/.

From: Caleb Clausen on
On 3/23/10, Robert Klemme <shortcutter(a)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.

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>

From: Smart RoR on


In the end, I wanted to see A as ancestor of B.
No classes, only modules.
--
Posted via http://www.ruby-forum.com/.