Le mercredi 25 juillet 2007 à 18:24 +0900, Robert Dober a écrit :
On 7/25/07, dohzya <dohzya@gmail.com> wrote:
> How about (C2.ancestors - [C2] - C2.superclass.ancestors) ?
You got it, indeed it was not so chellanging after all
Cheers
Robert
---
module M1 ; end
module M2 ; end
class C1 ; include M1 ; end
class C2 < C1 ; include M1 ; include M2 ; end
p (C2.ancestors - [C2] - C2.superclass.ancestors) # => [M2]
---
I don't know if it is a severe problem...
> > How about (C2.ancestors - [C2] - C2.superclass.ancestors) ?
> You got it, indeed it was not so chellanging after all
>
> Cheers
> Robert
>
There is a problem :
---
module M1 ; end
module M2 ; end
class C1 ; include M1 ; end
class C2 < C1 ; include M1 ; include M2 ; end
p (C2.ancestors - [C2] - C2.superclass.ancestors) # => [M2]
---
I don't know if it is a severe problem...
We have to ask OP, if he really wants to have M1 in this list I am
afraid that Fred's metaprogramming track by using Module#included is
the only way,
maybe it would be nice if OP could tell us what this is for.
--
Etienne Vallette d'Osia
Cheers
Robert
···
On 7/25/07, dohzya <dohzya@gmail.com> wrote:
Le mercredi 25 juillet 2007 à 18:24 +0900, Robert Dober a écrit :
> On 7/25/07, dohzya <dohzya@gmail.com> wrote:
--
I always knew that one day Smalltalk would replace Java.
I just didn't know it would be called Ruby
-- Kent Beck
There is another problem. If C2 doesn't inherit another class but does
include the modules and those modules by themselves include modules
then your code, still, will return the whole hierarchy. Look at this:
module M1; end
module M2; include M1; end
class C2; include M2; end
p (C2.ancestors - [C2] - C2.superclass.ancestors) # => [M1, M2]
That's because C2.superclass => Object
FireAphis
···
On Jul 25, 12:42 pm, dohzya <doh...@gmail.com> wrote:
Le mercredi 25 juillet 2007 à 18:24 +0900, Robert Dober a écrit :
> On 7/25/07, dohzya <doh...@gmail.com> wrote:
> > How about (C2.ancestors - [C2] - C2.superclass.ancestors) ?
> You got it, indeed it was not so chellanging after all
> Cheers
> Robert
There is a problem :
---
module M1 ; end
module M2 ; end
class C1 ; include M1 ; end
class C2 < C1 ; include M1 ; include M2 ; end
p (C2.ancestors - [C2] - C2.superclass.ancestors) # => [M2]
---
I don't know if it is a severe problem...
Le mercredi 25 juillet 2007 à 20:04 +0900, FireAphis a écrit :
There is another problem. If C2 doesn't inherit another class but does
include the modules and those modules by themselves include modules
then your code, still, will return the whole hierarchy. Look at this:
module M1; end
module M2; include M1; end
class C2; include M2; end
p (C2.ancestors - [C2] - C2.superclass.ancestors) # => [M1, M2]
That's because C2.superclass => Object
FireAphis
---
class Class
def included_modules
c = self
all = c.ancestors - [c]
bad = all.map {|a|
a.ancestors - [a]
}
# Module#superclass doesn't exist
bad << c.superclass if c.is_a? Class
all - bad.flatten
end
end
module M1; end
module M2; include M1; end
module M3; end
module M4; include M3; end
module M5; end
module M6; include M5; end
module M7; end
class C1; include M2; end
class C2<C1; include M4; end
class C3<C2; include M6; include M7; end
p C3.included_modules # => [M7, M6]
---
sorry if I've sent 3 messages, I'm fighting with my mail client...
> There is another problem. If C2 doesn't inherit another class but does
> include the modules and those modules by themselves include modules
> then your code, still, will return the whole hierarchy. Look at this:
>
> module M1; end
> module M2; include M1; end
> class C2; include M2; end
>
> p (C2.ancestors - [C2] - C2.superclass.ancestors) # => [M1, M2]
>
> That's because C2.superclass => Object
>
>
>
> FireAphis
You're right, but it can be fixed
no it cannot :(, look at C4 below
---
class Class
def included_modules
c = self
all = c.ancestors - [c]
bad = all.map {|a|
a.ancestors - [a]
}
# Module#superclass doesn't exist
bad << c.superclass if c.is_a? Class
all - bad.flatten
end
end
module M1; end
module M2; include M1; end
module M3; end
module M4; include M3; end
module M5; end
module M6; include M5; end
module M7; end
class C1; include M2; end
class C2<C1; include M4; end
class C3<C2; include M6; include M7; end
class C4<C2; include M5; include M6; end
···
On 7/25/07, dohzya <dohzya@gmail.com> wrote:
Le mercredi 25 juillet 2007 à 20:04 +0900, FireAphis a écrit :
*************************************
M5 will not show up.
p C3.included_modules # => [M7, M6]
---
sorry if I've sent 3 messages, I'm fighting with my mail client...
--
Etienne
--
I always knew that one day Smalltalk would replace Java.
I just didn't know it would be called Ruby
-- Kent Beck
This was the first and not fixable (with this solution) problem
module re-included are hidden
···
Le mercredi 25 juillet 2007 à 22:58 +0900, Robert Dober a écrit :
> You're right, but it can be fixed
no it cannot :(, look at C4 below
> ---
> class Class
> def included_modules
> c = self
> all = c.ancestors - [c]
> bad = all.map {|a|
> a.ancestors - [a]
> }
> # Module#superclass doesn't exist
> bad << c.superclass if c.is_a? Class
> all - bad.flatten
> end
> end
>
> module M1; end
> module M2; include M1; end
> module M3; end
> module M4; include M3; end
> module M5; end
> module M6; include M5; end
> module M7; end
> class C1; include M2; end
> class C2<C1; include M4; end
> class C3<C2; include M6; include M7; end
class C4<C2; include M5; include M6; end
*************************************
M5 will not show up.
---
module M1; end
module M2; end
module M3; include M2; end
class C1; include M1; end
class C2 < C1; include M1; include M2; include M3; end
---
only [M3] will show up
> > You're right, but it can be fixed
> no it cannot :(, look at C4 below
> > ---
> > class Class
> > def included_modules
> > c = self
> > all = c.ancestors - [c]
> > bad = all.map {|a|
> > a.ancestors - [a]
> > }
> > # Module#superclass doesn't exist
> > bad << c.superclass if c.is_a? Class
> > all - bad.flatten
> > end
> > end
> >
> > module M1; end
> > module M2; include M1; end
> > module M3; end
> > module M4; include M3; end
> > module M5; end
> > module M6; include M5; end
> > module M7; end
> > class C1; include M2; end
> > class C2<C1; include M4; end
> > class C3<C2; include M6; include M7; end
> class C4<C2; include M5; include M6; end
> *************************************
> M5 will not show up.
This was the first and not fixable (with this solution) problem
module re-included are hidden
---
module M1; end
module M2; end
module M3; include M2; end
class C1; include M1; end
class C2 < C1; include M1; include M2; include M3; end
---
only [M3] will show up
too bad...
yeah the information just is not in the ancestor array
but it was a nice try
···
On 7/25/07, dohzya <dohzya@gmail.com> wrote:
Le mercredi 25 juillet 2007 à 22:58 +0900, Robert Dober a écrit :
--
Etienne Vallette d'Osia
--
I always knew that one day Smalltalk would replace Java.
I just didn't know it would be called Ruby
-- Kent Beck