Issue #9573 has been updated by First Last.


Nobuyoshi Nakada wrote:
> First Last wrote:
> > Please clarify.  Mod1 is included in Class1 after Class2 extends Class1 and yet Class2 somehow learns of its new grandparent, Mod1.  How does that happen if ancestors (Class1) do not know their descendants (Class2).  So there is a difference, an ancestor added to a class, propagates to the descendant of this class, but an ancestor added to a module does not propagate to the descendant of this module.
> 
> `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.


----------------------------------------
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-45505

* 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/