From: "fxn (Xavier Noria) via ruby-core" Date: 2023-07-02T14:31:10+00:00 Subject: [ruby-core:114067] [Ruby master Feature#19742] Introduce `Module#anonymous?` Issue #19742 has been updated by fxn (Xavier Noria). > It would mean on remove_const and on const_set(name, v) when there was already a constant name, to change the name of the old constant if it is a module. If I understand this correctly, I believe it is not possible preserving today's rules. Nowadays, if a module was ever stored in a constant that belonged to a module with a permanent name, it has a permanent name. In other words, today, this cannot happen: ``` A::C.anonymous? # => true, not possible ``` If a reassignment or `remove_const` changed the name of the module to temporary, you could fall into that easily: ``` X::Y = Module.new Z::W = X::Y X::Y = Module.new ``` After that, `Z::W` cannot be anonymous if `Z` has a permanent name. Let me say it again: Ruby is not Java, there are no types or type identifiers or anything. It's all storage and objects. Chasing that a name is a constant path that resolves to the same object is going to leak, or will need to change the language. If a logical system does not have constraints, you won't get properties that do not follow. ---------------------------------------- Feature #19742: Introduce `Module#anonymous?` https://bugs.ruby-lang.org/issues/19742#change-103738 * Author: ioquatix (Samuel Williams) * Status: Open * Priority: Normal ---------------------------------------- As a follow-on , I'd like propose we introduce `Module#anonymous?`. In some situations, like logging/formatting, serialisation/deserialization, debugging or meta-programming, we might like to know if a class is a proper constant or not. However, this brings about some other issues which might need to be discussed. After assigning a constant, then removing it, the internal state of Ruby still believes that the class name is permanent, even thought it's no longer true. e.g. ``` m = Module.new m.anonymous? # true M = m m.anonyomous # false Object.send(:remove_const, :M) M # uninitialized constant M (NameError) m.anonymous? # false ``` Because RCLASS data structure is not updated after the constant is removed, internally the state still has a "permanent class name". I want to use this proposal to discuss this issue and whether there is anything we should do about such behaviour (or even if it's desirable). Proposed PR: https://github.com/ruby/ruby/pull/7966 cc @fxn -- 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/postorius/lists/ruby-core.ml.ruby-lang.org/