# Ruby namespace question

**URL:** <https://www.ruby-forum.com/t/ruby-namespace-question/158248>\
**Category:** Ruby\
**Created:** [January 21, 2009, 2:13am UTC](https://www.ruby-forum.com/t/ruby-namespace-question/158248 "2009-01-21T02:13:23Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![youhaodeyi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/b9bd4f/32.png) [@youhaodeyi](https://www.ruby-forum.com/u/youhaodeyi)\
**Post date:** [January 21, 2009, 2:13am UTC](https://www.ruby-forum.com/t/ruby-namespace-question/158248/1 "2009-01-21T02:13:23Z")

</div>

I require two ruby files which include two classes with the same name.  
how can I specify which class I use?

---

<div class="post-metadata">

**Author:** ![youhaodeyi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/b9bd4f/32.png) [@youhaodeyi](https://www.ruby-forum.com/u/youhaodeyi)\
**Post date:** [January 21, 2009, 2:45am UTC](https://www.ruby-forum.com/t/ruby-namespace-question/158248/2 "2009-01-21T02:45:43Z")

</div>

On Jan 20, 2009, at 17:11 , Zhao Yi wrote:

> I require two ruby files which include two classes with the same name.  
> how can I specify which class I use?

class X; end # x.rb  
class X; end # y.rb

same class, only one to specify. Files mean nothing in ruby, they’re  
just vehicles for the parser.

---

<div class="post-metadata">

**Author:** ![youhaodeyi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/b9bd4f/32.png) [@youhaodeyi](https://www.ruby-forum.com/u/youhaodeyi)\
**Post date:** [January 21, 2009, 2:51am UTC](https://www.ruby-forum.com/t/ruby-namespace-question/158248/3 "2009-01-21T02:51:17Z")

</div>

Ryan D. wrote:

> On Jan 20, 2009, at 17:11 , Zhao Yi wrote:
> 
> > I require two ruby files which include two classes with the same name.  
> > how can I specify which class I use?
> 
> class X; end # x.rb  
> class X; end # y.rb
> 
> same class, only one to specify. Files mean nothing in ruby, they’re  
> just vehicles for the parser.

For this code:

require ‘x.rb’  
require ‘y.rb’  
X.new #which class it uses, can I specify the class like x.X or y.X?

---

<div class="post-metadata">

**Author:** ![youhaodeyi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/b9bd4f/32.png) [@youhaodeyi](https://www.ruby-forum.com/u/youhaodeyi)\
**Post date:** [January 21, 2009, 3:16am UTC](https://www.ruby-forum.com/t/ruby-namespace-question/158248/4 "2009-01-21T03:16:46Z")

</div>

Zhao Yi wrote:

> > same class, only one to specify. Files mean nothing in ruby, they’re  
> > just vehicles for the parser.
> 
> For this code:
> 
> require ‘x.rb’  
> require ‘y.rb’  
> X.new #which class it uses, can I specify the class like x.X or y.X?

Why not answer this empirically? Try it out!

t.

–

```auto
Tom C., MS MA, LMHC - Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< removed_email_address@domain.invalid >> (email)
<< TomCloyd.com >> (website)
<< sleightmind.wordpress.com >> (mental health weblog)

```

---

<div class="post-metadata">

**Author:** ![youhaodeyi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/b9bd4f/32.png) [@youhaodeyi](https://www.ruby-forum.com/u/youhaodeyi)\
**Post date:** [January 21, 2009, 3:21am UTC](https://www.ruby-forum.com/t/ruby-namespace-question/158248/5 "2009-01-21T03:21:07Z")

</div>

Tom C. wrote:

> Why not answer this empirically? Try it out!

I have tried but failed. This is my code:

logger=log4r.Logger.new

and I got the error: undefined local variable or method log4r

---

<div class="post-metadata">

**Author:** ![youhaodeyi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/b9bd4f/32.png) [@youhaodeyi](https://www.ruby-forum.com/u/youhaodeyi)\
**Post date:** [January 21, 2009, 3:30am UTC](https://www.ruby-forum.com/t/ruby-namespace-question/158248/6 "2009-01-21T03:30:48Z")

</div>

Zhao Yi wrote:

> 

I think you want

logger = Log4r.Logger.new

or

logger = Log4r::Logger.new

But, glancing at the docs, you also need to specify a name for it, like

logger = Log4r::Logger.new “mylog”

Hope that helps.

-Justin

---

<div class="post-metadata">

**Author:** ![youhaodeyi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/b9bd4f/32.png) [@youhaodeyi](https://www.ruby-forum.com/u/youhaodeyi)\
**Post date:** [January 21, 2009, 3:33am UTC](https://www.ruby-forum.com/t/ruby-namespace-question/158248/7 "2009-01-21T03:33:56Z")

</div>

yesï¼Œ

logger = Log4r::Logger.new

works. thanks.

---

<div class="post-metadata">

**Author:** ![youhaodeyi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/b9bd4f/32.png) [@youhaodeyi](https://www.ruby-forum.com/u/youhaodeyi)\
**Post date:** [January 21, 2009, 11:48am UTC](https://www.ruby-forum.com/t/ruby-namespace-question/158248/8 "2009-01-21T11:48:46Z")

</div>

Zhao Yi wrote:

> Ryan D. wrote:
> 
> > On Jan 20, 2009, at 17:11 , Zhao Yi wrote:
> > 
> > > I require two ruby files which include two classes with the same name.  
> > > how can I specify which class I use?
> > 
> > class X; end # x.rb  
> > class X; end # y.rb
> > 
> > same class, only one to specify. Files mean nothing in ruby, they’re  
> > just vehicles for the parser.
> 
> For this code:
> 
> require ‘x.rb’  
> require ‘y.rb’  
> X.new #which class it uses, can I specify the class like x.X or y.X?

Nope - there is only one class X. Which file it was (first) defined in  
makes no difference. If you require ‘x.rb’ first then class X is  
created, and when you require ‘y.rb’ new methods are added into the  
_same_ class.

If you want them to be different, define them in different namespaces.  
This is what Log4r:: does (it refers to the namespace, not the file)

module One; class X; end; end # x.rb  
module Two; class X; end; end # y.rb

require ‘x’  
require ‘y’  
One::X.new # this is the one defined in x.rb  
Two::X.new # this is the one defined in y.rb
