How to get the module that a class resides in?

How can I do the equivalent of the following?

class Foo
  class Bar; end
end
Foo::Bar.module # => Foo

class Class
   def path
     result =
     self.name.split(/::/).inject(Object) do |c, n|
       result << c.const_get(n)
       result.last
     end
     return result
   end
end

class Foo
   class Bar
   end
end

p Foo::Bar.path
# => [Foo, Foo::Bar]

I have a hard time understanding why I needed to write that. Module.nesting looks close, but doesn't quite cut it (and is a pain since you have to call it within a module scope).

···

On Feb 17, 2005, at 12:14 PM, jc wrote:

How can I do the equivalent of the following?

class Foo
  class Bar; end
end
Foo::Bar.module # => Foo

What I'm really looking for is a more generic method, something like
Object#parent_namespace:

class A; end
module B
  class C
    D = A.new
  end
end

puts A.parent_namespace => Object
puts B.parent_namespace => Object
puts B::C.parent_namespace => B
puts B::C::D.parent_namespace => C
puts B::C::D.class.parent_namespace => Object

So that lookups could be easily done:

obj.parent_namespace.const_get(:name)
obj.parent_namespace.send(name, value)

Is there perhaps a way to do this via the Ruby C API?

Although far from being elegant, and won't work for anonymous classes,
you can get these methods by parsing what "inspect" and "name" gives
you.

Csaba

···

On 2005-02-18, jc <james.cromwell@gmail.com> wrote:

What I'm really looking for is a more generic method, something like
Object#parent_namespace:

class A; end
module B
  class C
    D = A.new
  end
end

puts A.parent_namespace => Object
puts B.parent_namespace => Object
puts B::C.parent_namespace => B
puts B::C::D.parent_namespace => C
puts B::C::D.class.parent_namespace => Object

So that lookups could be easily done:

obj.parent_namespace.const_get(:name)
obj.parent_namespace.send(name, value)

Is there perhaps a way to do this via the Ruby C API?