[#65451] [ruby-trunk - Feature #10333] [PATCH 3/1] optimize: "yoda literal" == string — ko1@...

Issue #10333 has been updated by Koichi Sasada.

9 messages 2014/10/07

[ruby-core:65466] [ruby-trunk - Feature #10320] require into module

From: sowieso@...
Date: 2014-10-07 12:27:26 UTC
List: ruby-core #65466
Issue #10320 has been updated by So Wieso.


Michael Gee wrote:
> I don't like changing `require` with one argument to mean something else.=
  It would break too much legacy code.

You are definitely right here, we should not do that.

Nobuyoshi Nakada wrote:
> It's ambiguous if Lib is a module or a class, when only the name is provi=
ded.

Is it? If the constant is already defined, take it (class or module). If no=
t create a new module by this name.

----------------------------------------
Feature #10320: require into module
https://bugs.ruby-lang.org/issues/10320#change-49246

* Author: So Wieso
* Status: Open
* Priority: Normal
* Assignee:=20
* Category: core
* Target version:=20
----------------------------------------
When requiring a library, global namespace always gets polluted, at least w=
ith one module name. So when requiring a gem with many dependencies, at lea=
st one constant enters global namespace per dependency, which can easily ge=
t 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 cu=
rrent binding (unless defined? Lib)
require_qualified 'libfile', :Lib
~~~

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

~~~ruby
module MyGem
=C2=A0=C2=A0require 'needed' in Need

=C2=A0=C2=A0def do_something
=C2=A0=C2=A0=C2=A0=C2=A0Need::important.process!
=C2=A0=C2=A0end
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 =C2=AD=E2=86=92 au=
to refinements?
* maybe also allow a binding as argument, not only a module?
* privately require, so that required constants and methods are not accessi=
ble 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



--=20
https://bugs.ruby-lang.org/

In This Thread

Prev Next