Actions
Bug #21363
closed`Namespace.current` should always return the Namespace in which it was defined
Bug #21363:
`Namespace.current` should always return the Namespace in which it was defined
ruby -v:
ruby 3.5.0dev (2025-05-22T23:07:21Z rm-assertion 17e71c7a24) +PRISM [arm64-darwin24]
Tags:
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) 7 months 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>}
Updated by hsbt (Hiroshi SHIBATA) 6 months ago
- Tags set to namespace
Updated by tagomoris (Satoshi Tagomori) about 19 hours ago
- Assignee set to tagomoris (Satoshi Tagomori)
Updated by tagomoris (Satoshi Tagomori) about 19 hours ago
- Status changed from Open to Closed
Now it's working as we expects:
MBA:build s-tagomori$ cat m.rb
module M
def self.test
p test: Ruby::Box.current
end
TEST = -> {
p lambda: Ruby::Box.current
}
end
MBA:build s-tagomori$ RUBY_BOX=1 ./exe/ruby -e 'b = Ruby::Box.new; b.require("./m"); p main: Ruby::Box.current; b::M.test; b::M::TEST.call'
./exe/ruby: warning: Ruby::Box is experimental, and the behavior may change in the future!
See doc/language/box.md for known issues, etc.
{main: #<Namespace:2,user,main>}
{test: #<Namespace:3,user,optional>}
{lambda: #<Namespace:3,user,optional>}
MBA:build s-tagomori$ ./exe/ruby -v
ruby 4.0.0dev (2025-12-09T12:29:36Z box-news-documents.. c998717de8) +PRISM [arm64-darwin24]
Actions