Project

General

Profile

Feature #10320

Updated by nobu (Nobuyoshi Nakada) almost 6 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

Back