From: "fxn (Xavier Noria) via ruby-core" Date: 2025-03-13T13:16:03+00:00 Subject: [ruby-core:121341] [Ruby master Misc#21143] Speficy order of execution const_added vs inherited Issue #21143 has been updated by fxn (Xavier Noria). > But if we still assign the name before calling inherited, then I think we can change the order without problem. Just to clarify in the thread, it is more than the name. Nowadays, the constant exists in `inherited` (maybe your patch preserves this too?) Provided both *internal* inheritance and constant assignment have happened, we are discussing the order in which the user-facing callbacks are invoked. As the description says, in `const_added`, today inheritance already happened (the value has a superclass), but note that the `inherited` callback was not fired. This is not inconsistent if we consider internal operations to be decouple from the public hooks. On the other hand, in `inherited`, the constant was already assigned (`const_get` gives it to you and the subclass has a permanent name). I am fine either way, though reordering would make me document in Zeitwerk that you cannot refer to certain constants in `inherited` hooks. Sometimes, the need to write such docs is a signal that the feature is not quite right. So, fine either way, but slightly slanted towards keeping things as they are and applying my doc + specs patch :). ---------------------------------------- Misc #21143: Speficy order of execution const_added vs inherited https://bugs.ruby-lang.org/issues/21143#change-112312 * 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/