From: "matz (Yukihiro Matsumoto) via ruby-core" <ruby-core@...>
Date: 2025-03-13T06:37:31+00:00
Subject: [ruby-core:121320] [Ruby master Misc#21143] Speficy order of execution const_added vs inherited

Issue #21143 has been updated by matz (Yukihiro Matsumoto).

Status changed from Open to Feedback

I think @eregon's opinion here is reasonable. But I don't want to break any existing code. I'd like to experiment `inherited`-then-`const_added` order works (or not).
If it works, I'd like to change the order. If it doesn't I'like to keep the current order (and document somewhere).

Matz.




----------------------------------------
Misc #21143: Speficy order of execution const_added vs inherited
https://bugs.ruby-lang.org/issues/21143#change-112285

* Author: fxn (Xavier Noria)
* Status: Feedback
----------------------------------------
The hooks `const_added` and `inherited` may need to be executed "together".

For example, consider:

```ruby
module M
  def self.const_added(cname) = ...

  class C
    def self.inherited(subclass) = ...
  end

  class D < C; end
end
```

When `D` is defined, two hooks are set to run, but in which order?

Both orders make sense in a way:

1. When `inherited` is called, you can observe that the subclass has a permanent name, ergo it was assigned to a constant, which must me stored in a class or module object. Therefore, the constant was added to said class/module before `inherited` was invoked.

1. When `const_added` is called, you can `const_get` the symbol and observe the object is a class, hence with a superclass, hence inheritance already happened.

The patch in [ruby#12759](https://github.com/ruby/ruby/pull/12759) documents and adds a test for (1). Rationale:

1. I believe it would be nice to specify this order.

1. Chose (1) because it is how it works today.

While the motivation for the patch was formal (to remove an ambiguity), after reflecting about this I realized users of Zeitwerk may depend on this. Nowadays, Zeitwerk uses `const_added` to set autoloads for child constants in namespaces. Thanks to the current order, code can be used in `inherited` hooks normally (it would not be ready if the order was different).




-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/