Project

General

Profile

Actions

Bug #21363

open

`Namespace.current` should always return the Namespace in which it was defined

Added by tenderlovemaking (Aaron Patterson) 1 day ago. Updated about 6 hours ago.

Status:
Open
Assignee:
-
Target version:
-
ruby -v:
ruby 3.5.0dev (2025-05-22T23:07:21Z rm-assertion 17e71c7a24) +PRISM [arm64-darwin24]
[ruby-core:122240]

Description

I think Namespace.current should always return the namespace in which it was defined. Here is an example to demonstrate what I mean:

File.binwrite("ns.rb", <<-RUBY)
# namespace 3

module M
  def self.test
    p Namespace.current
  end

  TEST = -> {
    p Namespace.current
  }
end
RUBY

ns = Namespace.new
ns.load "./ns.rb"

p Namespace.current
ns::M.test
ns::M::TEST.call

I expect the output of ns::M.test and ns::M::TEST.call to be the same. Instead the output is like this:

#<Namespace:2,user,main>
#<Namespace:3,user,optional>
#<Namespace:2,user,main>

I think a method and lambda defined in the same namespace should return the same value for Namespace.current

Updated by tenderlovemaking (Aaron Patterson) about 6 hours ago

To be more specific, given this program:

File.binwrite("ns.rb", <<-RUBY)
# namespace 3

module M
  def self.test
    p test: Namespace.current
  end

  TEST = -> {
    p lambda: Namespace.current
  }
end
RUBY

ns = Namespace.new
ns.load "./ns.rb"

p main: Namespace.current
ns::M.test
ns::M::TEST.call

I expect the following output:

{main: #<Namespace:2,user,main>}
{test: #<Namespace:3,user,optional>}
{lambda: #<Namespace:3,user,optional>}

But I got the following output:

{main: #<Namespace:2,user,main>}
{test: #<Namespace:3,user,optional>}
{lambda: #<Namespace:2,user,main>}
Actions

Also available in: Atom PDF

Like0
Like0