Project

General

Profile

Actions

Feature #10320

open

require into module

Added by sowieso (So Wieso) over 9 years ago. Updated over 1 year ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:65380]

Description

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:

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

This would also make including code into libraries much easier, as it is well scoped.

module MyGem
  require 'needed' in Need

  def do_something
    Need::important.process!
  end
end
 # library user is never concerned over needed's content

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


Related issues 3 (2 open1 closed)

Related to Ruby master - Feature #5643: require/load options and binding optionAssignedmatz (Yukihiro Matsumoto)Actions
Related to Ruby master - Feature #13847: Gem activated problem for default gemsAssignedhsbt (Hiroshi SHIBATA)Actions
Related to Ruby master - Feature #19024: Proposal: Import ModulesClosedActions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0