Redefining class

H

Henry Savr

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
 
M

Mauricio Fernandez

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.

class X; end
module Y; class ::X; def foo; "X#foo"; end end end
X.new.foo # => "X#foo"
 
R

Rick DeNatale

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
 
M

Mauricio Fernandez

==
This is what my message was about; you omitted it in your irb session.
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
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 :)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,051
Latest member
CarleyMcCr

Latest Threads

Top