[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Redefining class

Henry Savr

8/24/2006 4:53:00 PM

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

--
Posted via http://www.ruby-....

5 Answers

Mauricio Fernández

8/24/2006 6:27:00 PM

0

On Fri, Aug 25, 2006 at 01:52:43AM +0900, Henry Savr wrote:
> 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"

--
Mauricio Fernandez - http://eige... - singular Ruby

Rick DeNatale

8/24/2006 11:47:00 PM

0

On 8/24/06, Mauricio Fernandez <mfp@acm.org> 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.denh...

Mauricio Fernández

8/25/2006 12:23:00 AM

0

On Fri, Aug 25, 2006 at 08:46:54AM +0900, Rick DeNatale wrote:
> On 8/24/06, Mauricio Fernandez <mfp@acm.org> 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
http://eige.../hiki.rb?ruby+xmpfi...

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

--
Mauricio Fernandez - http://eige... - singular Ruby

Rick DeNatale

8/25/2006 4:44:00 AM

0

On 8/24/06, Mauricio Fernandez <mfp@acm.org> 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.denh...

dblack

8/27/2006 7:05:00 PM

0