# Redefining class

**URL:** <https://www.ruby-forum.com/t/redefining-class/66312>\
**Category:** Ruby\
**Created:** [August 24, 2006, 6:52pm UTC](https://www.ruby-forum.com/t/redefining-class/66312 "2006-08-24T18:52:42Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![henrys](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/3d9bf3/32.png) [@henrys](https://www.ruby-forum.com/u/henrys)\
**Post date:** [August 24, 2006, 6:52pm UTC](https://www.ruby-forum.com/t/redefining-class/66312/1 "2006-08-24T18:52:42Z")

</div>

Thank you, guys, for help with my previous problems. With your  
assistance my second week with Ruby was more or less successful.

However…  
I redefined couple methods of the Time class  
Everything worked fine, so I wanted to combine all the stuff in the  
module. But Ruby began complaining, when I just enclosed my job with  
words “module X1” and “end”.

# That was fine: class Time … end class Is … end class Money … end

# Problems start here: module X1 class Time … end class Is … end class Money … end end

I think, that Ruby considers class Time inside the module as a new  
class, which belongs module X1. So I have to inform him/her 🙂 , that  
it is the same class, as the original one. And I don’t know how to do  
that.

Please, help.  
Thank you  
Henry

---

<div class="post-metadata">

**Author:** ![henrys](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/3d9bf3/32.png) [@henrys](https://www.ruby-forum.com/u/henrys)\
**Post date:** [August 24, 2006, 8:28pm UTC](https://www.ruby-forum.com/t/redefining-class/66312/2 "2006-08-24T20:28:50Z")

</div>

On Fri, Aug 25, 2006 at 01:52:43AM +0900, Henry S. wrote:

> # end end
> 
> I think, that Ruby considers class Time inside the module as a new  
> class, which belongs module X1. So I have to inform him/her 🙂 , that  
> it is the same class, as the original one. And I don’t know how to do  
> that.

class X; end  
module Y; class ::X; def foo; “X#foo”; end end end  
X.new.foo # =\> “X#foo”

---

<div class="post-metadata">

**Author:** ![henrys](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/3d9bf3/32.png) [@henrys](https://www.ruby-forum.com/u/henrys)\
**Post date:** [August 25, 2006, 2:23am UTC](https://www.ruby-forum.com/t/redefining-class/66312/3 "2006-08-25T02:23:35Z")

</div>

On Fri, Aug 25, 2006 at 08:46:54AM +0900, Rick DeNatale wrote:

> On 8/24/06, Mauricio F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> > class X; end  
> > module Y; class ::X; def foo; “X#foo”; end end end  
> > ==  
> > This is what my message was about; you omitted it in your irb session.

> > X.new.foo # =\> “X#foo”
> 
> Really? Was this under 1.8.x or 1.9,

Under

RUBY\_VERSION # =\> “1.8.5”  
RUBY\_RELEASE\_DATE # =\> “2006-07-07”

> I’d be surprised if it was either, a gedanken experiment perhaps?

No. I ran that code under xmpfilter  
[eigenclass.org](http://eigenclass.org/hiki.rb?ruby+xmpfilter+0.2.0)

It’s pretty convenient for ruby-talk postings, and the output is much  
easier  
to read than irb transcripts.

> irb(main):001:0\> class X  
> irb(main):002:1\> end  
> =\> nil  
> irb(main):003:0\> module Y; class X; def foo; “X#foo”; end; end  
> ========  
> this is not the code I wrote (it’s missing the :🙂  
> irb(main):004:1\> end  
> =\> nil  
> iirb(main):005:0\> X.new.foo  
> NoMethodError: undefined method `foo’ for #\<X:0xb7d4f560\>  
> from (irb):6  
> from :0  
> irb(main):006:0\> Y::X.new.foo  
> =\> “X#foo”  
> […]

With the original code:

irb(main):001:0\> class X; end  
=\> nil  
irb(main):002:0\> module Y; class ::X; def foo; “X#foo”; end end end  
=\> nil  
irb(main):003:0\> X.new.foo  
=\> “X#foo”

(definitely harder to read 🙂

---

<div class="post-metadata">

**Author:** ![henrys](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/3d9bf3/32.png) [@henrys](https://www.ruby-forum.com/u/henrys)\
**Post date:** [August 25, 2006, 6:46am UTC](https://www.ruby-forum.com/t/redefining-class/66312/4 "2006-08-25T06:46:01Z")

</div>

On 8/24/06, Mauricio F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> On Fri, Aug 25, 2006 at 08:46:54AM +0900, Rick DeNatale wrote:

> > irb(main):003:0\> module Y; class X; def foo; “X#foo”; end; end  
> > ========  
> > this is not the code I wrote (it’s missing the :🙂

## Okay, I missed that, I guess it’s time for new eyeglasses.

Rick DeNatale

My blog on Ruby  
[http://talklikeaduck.denhaven2.com/](http://talklikeaduck.denhaven2.com/)

---

<div class="post-metadata">

**Author:** ![henrys](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/3d9bf3/32.png) [@henrys](https://www.ruby-forum.com/u/henrys)\
**Post date:** [August 25, 2006, 1:47am UTC](https://www.ruby-forum.com/t/redefining-class/66312/5 "2006-08-25T01:47:32Z")

</div>

On 8/24/06, Mauricio F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> class X; end  
> module Y; class ::X; def foo; “X#foo”; end end end  
> X.new.foo # =\> “X#foo”

Really? Was this under 1.8.x or 1.9, I’d be surprised if it was  
either, a gedanken experiment perhaps?

irb(main):001:0\> class X  
irb(main):002:1\> end  
=\> nil  
irb(main):003:0\> module Y; class X; def foo; “X#foo”; end; end  
irb(main):004:1\> end  
=\> nil  
iirb(main):005:0\> X.new.foo  
NoMethodError: undefined method `foo’ for #\<X:0xb7d4f560\>  
from (irb):6  
from :0  
irb(main):006:0\> Y::X.new.foo  
=\> “X#foo”

The original poster’s supposition is correct, modules (and classes for  
that matter) are namespaces,

irb(main):001:0\> module X1  
irb(main):002:1\> class Time  
irb(main):003:2\> end  
irb(main):004:1\> end  
=\> nil  
irb(main):005:0\> X1::Time == Time  
=\> false

The Time class inside X1 is different than the Time class!

irb(main):006:0\> module X1  
irb(main):007:1\> class Time  
irb(main):008:2\> def foo  
irb(main):009:3\> “foo”  
irb(main):010:3\> end  
irb(main):011:2\> end  
irb(main):012:1\> end  
=\> nil  
irb(main):013:0\> Time.new.foo  
NoMethodError: undefined method `foo’ for Thu Aug 24 19:38:52 EDT  
2006:Time  
from (irb):13  
from :0  
irb(main):014:0\> X1::Time.new.foo  
=\> “foo”

With it’s own methods!

And if we just refer to Time inside X1

irb(main):023:0\> module X1  
irb(main):024:1\> def self.myTime  
irb(main):025:2\> Time  
irb(main):026:2\> end  
irb(main):027:1\> end  
=\> nil  
irb(main):028:0\> X1.myTime  
=\> X1::Time

We get X1’s Time.

Now that begs the question of how to refer to the ‘real’ Time class  
inside a module. One way is with an “empty namespace.”

irb(main):015:0\> module X1  
irb(main):016:1\> def self.baseTime  
irb(main):017:2\> ::Time  
irb(main):018:2\> end  
irb(main):019:1\> end  
=\> nil  
irb(main):020:0\> X1.baseTime  
=\> Time  
irb(main):021:0\> X1.baseTime == Time  
=\> true

–  
Rick DeNatale

My blog on Ruby  
[http://talklikeaduck.denhaven2.com/](http://talklikeaduck.denhaven2.com/)

---

<div class="post-metadata">

**Author:** ![henrys](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/3d9bf3/32.png) [@henrys](https://www.ruby-forum.com/u/henrys)\
**Post date:** [August 27, 2006, 9:07pm UTC](https://www.ruby-forum.com/t/redefining-class/66312/6 "2006-08-27T21:07:07Z")

</div>

Hi –

On Fri, 25 Aug 2006, Rick DeNatale wrote:

> On 8/24/06, Mauricio F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> > On Fri, Aug 25, 2006 at 08:46:54AM +0900, Rick DeNatale wrote:
> 
> > > irb(main):003:0\> module Y; class X; def foo; “X#foo”; end; end  
> > > ========  
> > > this is not the code I wrote (it’s missing the :🙂
> 
> Okay, I missed that, I guess it’s time for new eyeglasses.

Or eigenglasses 🙂

David
