# Ruby Namespaces / Modules

**URL:** <https://www.ruby-forum.com/t/ruby-namespaces-modules/79285>\
**Category:** Ruby\
**Created:** [March 10, 2006, 1:15am UTC](https://www.ruby-forum.com/t/ruby-namespaces-modules/79285 "2006-03-10T01:15:52Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [March 10, 2006, 1:15am UTC](https://www.ruby-forum.com/t/ruby-namespaces-modules/79285/1 "2006-03-10T01:15:52Z")

</div>

If I’m in the middle of module A:🅱:C, and I want to reference a class  
from A::B or from A:🅱:D, do I need to do :🅰🅱:Classname (or  
:🅰🅱: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?

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [March 10, 2006, 1:28am UTC](https://www.ruby-forum.com/t/ruby-namespaces-modules/79285/2 "2006-03-10T01:28:03Z")

</div>

Quoting removed\_email\_address@domain.invalid:

> If I’m in the middle of module A:🅱:C, and I want to reference a  
> class from A::B or from A:🅱:D, do I need to  
> do :🅰🅱:Classname (or :🅰🅱: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

-mental

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [March 10, 2006, 1:40am UTC](https://www.ruby-forum.com/t/ruby-namespaces-modules/79285/3 "2006-03-10T01:40:07Z")

</div>

removed\_email\_address@domain.invalid writes:

> > 
> 
> ```
> end
> end
> 
> ```
> 
> end  
> module C  
> p B::Foo  
> p B::D::Bar  
> end  
> end

It’s also worth pointing out that:

class A:🅱:Foo  
p C  
end

is different to:

module A  
module B  
class Foo  
p C  
end  
end  
end

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

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [March 10, 2006, 1:46am UTC](https://www.ruby-forum.com/t/ruby-namespaces-modules/79285/4 "2006-03-10T01:46:14Z")

</div>

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

Intersting… why is that?

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [March 10, 2006, 2:19am UTC](https://www.ruby-forum.com/t/ruby-namespaces-modules/79285/5 "2006-03-10T02:19:29Z")

</div>

removed\_email\_address@domain.invalid writes:

> > The latter may reference A:🅱: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://rubyurl.com/1NH](http://rubyurl.com/1NH)  
[http://rubyurl.com/0KZ](http://rubyurl.com/0KZ)
