How can I do the equivalent of the following?
class Foo
class Bar; end
end
Foo::Bar.module # => Foo
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
endputs 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 => ObjectSo 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?