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

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

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

--
Mauricio Fernandez - http://eigenclass.org - singular Ruby

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

···

On 8/24/06, Mauricio Fernandez <mfp@acm.org> wrote:
        from :0

--
Rick DeNatale

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

>
>class X; end
>module Y; class ::X; def foo; "X#foo"; end end end

···

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

On 8/24/06, Mauricio Fernandez <mfp@acm.org> wrote:

                   ==
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://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 ::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:

--
Mauricio Fernandez - http://eigenclass.org - singular Ruby

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

···

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

--
Rick DeNatale

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

Hi --

···

On Fri, 25 Aug 2006, Rick DeNatale wrote:

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

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

Or eigenglasses :slight_smile:

David

--
http://www.rubypowerandlight.com => Ruby/Rails training & consultancy
   ----> SEE SPECIAL DEAL FOR RUBY/RAILS USERS GROUPS! <-----
http://dablog.rubypal.com => D[avid ]A[. ]B[lack's][ Web]log
Ruby for Rails => book, Ruby for Rails
http://www.rubycentral.org => Ruby Central, Inc.