From: "shioyama (Chris Salzberg)" Date: 2022-08-22T04:30:11+00:00 Subject: [ruby-core:109623] [Ruby master Bug#18960] Module#using raises RuntimeError when called at toplevel from wrapped script Issue #18960 has been updated by shioyama (Chris Salzberg). I'm new to contributing to Ruby, but I haven't gotten a response on this in a couple weeks so wondering if maybe this requires more context. For reference, here are the docs on the `wrap` parameter to [`Kernel#load`](https://ruby-doc.org/core-3.1.2/Kernel.html#method-i-load): > If the optional _wrap_ parameter is true, the loaded script will be executed under an anonymous module, protecting the calling program's global namespace. If the optional _wrap_ parameter is a module, the loaded script will be executed under the given module. In no circumstance will any local variables in the loaded file be propagated to the loading environment. So in theory if I have a file like this: ```ruby # using.rb using Module.new ``` then loading it with `wrap` in the following: ```ruby MyModule = Module.new load "./using.rb", MyModule ``` should be the same as this: ```ruby module MyModule using Module.new end ``` However, whereas the latter works fine, the former fails with the error reported in the issue. Note that if I do the same inside of a block to `Module.new`, like this: ```ruby Module.new do using Module.new end ``` then I get a different error, `RuntimeError: Module#using is not permitted in methods`. So "the loaded script will be executed under an anonymous module" in the docs is somewhat misleading since it's not as simple as injecting the code in `using.rb` into the block to `Module.new`. Regardless though I don't think the error I'm seeing ("main.using is permitted only at toplevel") is correct, I think this should work. @jeremyevans0 You [most recently contributed to the `wrap` option](https://bugs.ruby-lang.org/issues/6210), what do you think about this? Would you see it as a bug? ---------------------------------------- Bug #18960: Module#using raises RuntimeError when called at toplevel from wrapped script https://bugs.ruby-lang.org/issues/18960#change-98808 * Author: shioyama (Chris Salzberg) * Status: Open * Priority: Normal * ruby -v: 3.1.2p20 * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN ---------------------------------------- I noticed that this file works when loaded with `load`, but fails if you pass `true` (or a module) as the `wrap` argument. ```ruby # using.rb using Module.new ``` This works: ```ruby load "./using.rb" ``` This doesn't: ```ruby load "./using.rb", true # raises RuntimeError (main.using is permitted only at toplevel) ``` I believe the latter should work. -- https://bugs.ruby-lang.org/ Unsubscribe: