[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Re: Ruby Namespaces / Modules

George Ogata

3/9/2006 11:57:00 PM

mental@rydia.net writes:

> Quoting eastcoastcoder@gmail.com:
>
>> If I'm in the middle of module A::B::C, and I want to reference a
>> class from A::B or from A::B::D, do I need to
>> do ::A::B::Classname (or ::A::B::D::Classname)?
>>
>> It seems a bit repititous to me. A module shouldn't need to know
>> it's ancestors all the way up - just what it needs to use.
>> Having to keep track couples modules to a tree and obstructs
>> refactoring.
>>
>> So, what say the veteran Rubyists?
>
> Try it!
>
> module A
> module B
> class Foo
> end
> module D
> class Bar
> end
> end
> end
> module C
> p B::Foo
> p B::D::Bar
> end
> end

It's also worth pointing out that:

class A::B::Foo
p C
end

is different to:

module A
module B
class Foo
p C
end
end
end

The latter may reference A::B::C or A::C, whereas the former cannot.
2 Answers

George Ogata

3/10/2006 12:35:00 AM

0

eastcoastcoder@gmail.com writes:

>> The latter may reference A::B::C or A::C, whereas the former cannot.
>
> Intersting... why is that?

Doing "module X::Y::Z" (or "class X::Y::Z") will bring only X::Y::Z::*
constants into scope. Constants from outer modules (X::Y::*, X::*)
aren't brought in. Thus, to get all the nested namespaces in scope,
you need to open each one explicitly.

It's been debated:

http://rubyu...
http://rubyu...

eastcoastcoder

3/10/2006 12:39:00 AM

0

> The latter may reference A::B::C or A::C, whereas the former cannot.

Intersting... why is that?