[ruby-core:112193] [Ruby master Bug#19405] Prevent Use of include CustomModule in a Nested Class

Issue #19405 has been reported by kyonides (Edwin Acuña). ---------------------------------------- Bug #19405: Prevent Use of include CustomModule in a Nested Class https://bugs.ruby-lang.org/issues/19405 * Author: kyonides (Edwin Acuña) * Status: Open * Priority: Normal * ruby -v: ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux-gnu] * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- Bug present ever since **Ruby 1.8**. Tested in **Ruby 2.7 and 3.0** as well. I would like to request the developers to prevent any person from doing something as illogical and useless as the code I have provided you with right below. ``` ruby module MyModule class MyClass A = 'A' B = 'B' include MyModule end end ``` If you print something like: ``` ruby puts MyModule::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::B ``` Ruby will let you do it! Why is it possible to chain the calls to MyClass class forever and ever? It should throw an error for including the very same module and class where the constants are nested. Proposed Error Class: "ModuleError: Class nested in module %s cannot call include method to add the same module." Or something the like. =_=¡ -- https://bugs.ruby-lang.org/

Issue #19405 has been updated by jeremyevans0 (Jeremy Evans). Status changed from Open to Rejected This is not a bug, this is expected behavior. It is true in Ruby even if you don't define any classes: ```ruby Object::Object::Object::Object::Object::Object::Object::Object::Object::Object::Object::Object::Object::Object::Object::Object::Object::Object # => Object ``` If you want to prevent this, you could override `include`: ```ruby module MyModule class MyClass A = 'A' B = 'B' def self.include(mod) raise if mod.const_get(name) == self super end include MyModule end end ``` You can even try to handle this globally: ```ruby class Module def append_features(mod) raise if const_get(mod.name) == mod super end end ``` That only handles the direct inclusion case, it won't handle more complex cases, or even other simple cases such as `module MyModule; MyModule = self end`. In general, you should just accept that this is how Ruby is, and it isn't a problem. ---------------------------------------- Bug #19405: Prevent Use of include CustomModule in a Nested Class https://bugs.ruby-lang.org/issues/19405#change-101629 * Author: kyonides (Edwin Acuña) * Status: Rejected * Priority: Normal * ruby -v: ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux-gnu] * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- Bug present ever since **Ruby 1.8**. Tested in **Ruby 2.7 and 3.0** as well. I would like to request the developers to prevent any person from doing something as illogical and useless as the code I have provided you with right below. ``` ruby module MyModule class MyClass A = 'A' B = 'B' include MyModule end end ``` If you print something like: ``` ruby puts MyModule::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::MyClass::B ``` Ruby will let you do it! Why is it possible to chain the calls to MyClass class forever and ever? It should throw an error for including the very same module and class where the constants are nested. Proposed Error Class: "ModuleError: Class nested in module %s cannot call include method to add the same module." Or something the like. =_=¡ -- https://bugs.ruby-lang.org/
participants (2)
-
jeremyevans0 (Jeremy Evans)
-
kyonides