[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

How to get the module that a class resides in?

jc

2/17/2005 8:11:00 PM

How can I do the equivalent of the following?

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

3 Answers

Ryan Davis

2/17/2005 9:02:00 PM

0


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

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).



jc

2/18/2005 3:12:00 PM

0

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?

Csaba Henk

2/18/2005 7:43:00 PM

0

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?

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