From: "mame (Yusuke Endoh)" Date: 2022-09-21T09:46:38+00:00 Subject: [ruby-core:109973] [Ruby master Feature#10320] require into module Issue #10320 has been updated by mame (Yusuke Endoh). The proposed PR is simple, small, and appears to have few performance or compatibility issues. So I am basically positive about this proposal. > The main goal is to avoid accidental dependency. I guess that the ultimate goal is to modularize the monolith to microservices, and that this proposal is for the intermediate stage (i.e., to modularize the monolith in a process). Am I right? It is not so obvious to me that this intermediate step would be useful, maybe because I don't have enough experience in monolith development :-) > Resolve top-level references (::Foo) when loaded with wrap to the top of the module namespace, rather than the "absolute" top. For now I've done this in the gem using const_missing, but I intend on moving this to the Ruby patch. This approach looks not very robust. If there is a constant `Foo` defined in the top-level, I think it does not work. ``` # foo.rb A = :foo p ::A ``` ``` # main.rb A = :main load "foo.rb", Module.new #=> expect: :foo, Im hack: :main ``` More dedicated support in the Ruby core side would be necessary, I think. But I am curious about how much the change brings performance degeneration. ---------------------------------------- Feature #10320: require into module https://bugs.ruby-lang.org/issues/10320#change-99223 * Author: sowieso (So Wieso) * Status: Open * Priority: Normal ---------------------------------------- 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 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. ~~~ruby 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 -- https://bugs.ruby-lang.org/ Unsubscribe: