Redefining class

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 :slight_smile: , that
it is the same class, as the original one. And I don’t know how to do
that.

Please, help.
Thank you
Henry

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 :slight_smile: , 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”

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

On 8/24/06, Mauricio F. [email protected] 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

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 ::slight_smile:
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 :slight_smile:

On 8/24/06, Mauricio F. [email protected] 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 ::slight_smile:

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

Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

On 8/24/06, Mauricio F. [email protected] 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/

Hi –

On Fri, 25 Aug 2006, Rick DeNatale wrote:

On 8/24/06, Mauricio F. [email protected] 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 ::slight_smile:

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

Or eigenglasses :slight_smile:

David