Issue #9573 has been updated by First Last.


First Last wrote:
> Nobuyoshi Nakada wrote:
> > 
> > `Class1` only knows `Mod1`, and its ancestor tree is copied into `Class2`.
> > And ditto for including a module.
> 
> I am inferring that the ancestor tree is copied into Class2 when it extends Class1, yes?
> But at this time Mod1 has not yet been included, so how does Class2 learn of Mod1?
> 
> and why is the situation different with modules?
> 
> Do you see what I am pointing out, an ancestor added to a class, propagates to the **past** descendant of this class (Class2 extends Class1 **before** Mod1 is included in Class1), but an ancestor added to a module does not propagate to the **past** descendant of this module.

Can someone please explain this phenomenon.


----------------------------------------
Bug #9573: descendants of a module don't gain its future ancestors, but descendants of a class, do
https://bugs.ruby-lang.org/issues/9573#change-45508

* Author: First Last
* Status: Open
* Priority: Normal
* Assignee: 
* Category: 
* Target version: 
* ruby -v: ruby 2.1.1p76 (2014-02-24 revision 45161) [i686-linux]
* Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
```ruby
module Mod1
end

module Mod2
end

class Class1
end

class Class2 < Class1
end

p Class2.ancestors - Object.ancestors # [Class2, Class1]

Class1.include Mod1

p Class2.ancestors - Object.ancestors # [Class2, Class1, Mod1]

Mod1.include Mod2

p Mod1.ancestors - Object.ancestors # [Mod1, Mod2]

p Class2.ancestors - Object.ancestors # [Class2, Class1, Mod1]
```
________________________________________________________________

note that descendants of a class do gain its future ancestors

so 2 issues:

1. It would seem natural that in dynamic language, dynamically added ancestors should propagate to descendants
2. Why is there a difference in ancestor propagation between modules and classes
 



-- 
http://bugs.ruby-lang.org/