Issue #9573 has been updated by jeremyevans0 (Jeremy Evans).

File include-future-ancestors-9573.patch added

Attached is a patch that implements support for this for `Module#include`, but not `Module#prepend`.  It passes `make check`.  I'm not sure if we want to support this for `Module#include` but not `Module#prepend`, as it would make them inconsistent.

`Module#include` support isn't too difficult to implement.  Conceptually, the patch is similar to the pull request nobu was working on (https://github.com/ruby/ruby/pull/549).  nobu's approach using `rb_class_foreach_subclass` is definitely simpler, but I'm not sure what the issues were with it that caused the pull request to be closed (I didn't see nobu's pull request until after working on my patch).

It is probably possible to support this for `Module#prepend`, but I believe it would at least require creating an origin module for all modules that are included/prepended to other modules/classes.  I think that's a necessary condition, but not a sufficient one, as doing that by itself doesn't allow `Module#prepend` to work similarly.



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

* Author: rits (First Last)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.1.1p76 (2014-02-24 revision 45161) [i686-linux]
* Backport: 
----------------------------------------
```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
 

---Files--------------------------------
include-future-ancestors-9573.patch (3.49 KB)


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

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>