Feature #10320
Updated by nobu (Nobuyoshi Nakada) about 10 years ago
When requiring a library, global namespace always gets polluted, at least with one module name. So when requiring a gem with many dependencies, at least one constant enters global namespace per dependency, which can easily get out of hand (especially when gems are not enclosed in a module). Would it be possible to extend require (and load, require_relative) to put all content into a custom module and not into global namespace? Syntax ideas: ~~~ruby <code> require 'libfile', into: :Lib # keyword-argument require 'libfile' in Lib # with keyword, also defining a module Lib at current binding (unless defined? Lib) require_qualified 'libfile', :Lib ~~~ </code> This would also make including code into libraries much easier, as it is well scoped. ~~~ruby <code> module MyGem require 'needed' in Need def do_something Need::important.process! end end # library user is never concerned over needed's content ~~~ </code> Some problems to discuss: * ‣ requiring into two different modules means loading the file twice? * ‣ monkeypatching libraries should only affect the module → auto refinements? * ‣ maybe also allow a binding as argument, not only a module? * ‣ privately require, so that required constants and methods are not accessible from the outside of a module (seems to difficult) * ‣ what about $global constants, read them from global scope but copy-write them only to local scope? Similar issue: https://bugs.ruby-lang.org/issues/5643