Question about how ruby sources is parsed

Hi,

I recently came came up with this piece of (monkey-inspired) code:

    class String0 < String
        def foo
            123
        end
    end

    Object.send :remove_const, :String
    String = String0

This makes the following two statements work as intended:

    p String0.new("foo").foo # => 123
    p String.new("foo").foo # => 123

The following doesn't work though:

    p "foo".foo
    p eval %{"foo".foo}

    undefined method `foo' for "foo":String (NoMethodError)

Has somebody an idea if it is possible to make the ruby parser use
the
new String class somehow? I assume there is no way to make this work
but
then: I'd be happy if somebody proves me wrong.

Regards,
Thomas.

That's weird looking stuff, I can't imaging that it's good to do thing that way.

What's wrong with

class String
  def foo
     123
  end
end

?

Jason

···

On Wed, Feb 27, 2008 at 10:19 AM, ThoML <micathom@gmail.com> wrote:

Hi,

I recently came came up with this piece of (monkey-inspired) code:

    class String0 < String
        def foo
            123
        end
    end

    Object.send :remove_const, :String
    String = String0

This makes the following two statements work as intended:

    p String0.new("foo").foo # => 123
    p String.new("foo").foo # => 123

The following doesn't work though:

    p "foo".foo
    p eval %{"foo".foo}

    undefined method `foo' for "foo":String (NoMethodError)

Has somebody an idea if it is possible to make the ruby parser use
the
new String class somehow? I assume there is no way to make this work
but
then: I'd be happy if somebody proves me wrong.

Regards,
Thomas.

I think "" is hard-wired to constructing String class objects, as the {} is to creating Hash and is to creating Array.

Best regards,

Jari Williamsson

ThoML wrote:

···

Hi,

I recently came came up with this piece of (monkey-inspired) code:

    class String0 < String
        def foo
            123
        end
    end

    Object.send :remove_const, :String
    String = String0

This makes the following two statements work as intended:

    p String0.new("foo").foo # => 123
    p String.new("foo").foo # => 123

The following doesn't work though:

    p "foo".foo
    p eval %{"foo".foo}

    undefined method `foo' for "foo":String (NoMethodError)

Has somebody an idea if it is possible to make the ruby parser use
the
new String class somehow? I assume there is no way to make this work
but
then: I'd be happy if somebody proves me wrong.

Regards,
Thomas.

You can't do this without modifying the interpreter.

···

On Feb 27, 2008, at 07:19 AM, ThoML wrote:

I recently came came up with this piece of (monkey-inspired) code:

   class String0 < String
       def foo
           123
       end
   end

   Object.send :remove_const, :String
   String = String0

This makes the following two statements work as intended:

   p String0.new("foo").foo # => 123
   p String.new("foo").foo # => 123

The following doesn't work though:

   p "foo".foo
   p eval %{"foo".foo}

   undefined method `foo' for "foo":String (NoMethodError)

Has somebody an idea if it is possible to make the ruby parser use
the new String class somehow? I assume there is no way to make this work
but then: I'd be happy if somebody proves me wrong.

What's wrong with

class String
  def foo
     123
  end
end

Nothing if that's what you want.

The above question was inspired by certain posts to the monkey-thread
and the idea of stacked classes/methods, the proposal of module-
specific hacks and the idea of Module.import/rename (I looked at the
original library referenced by Pit Captain but didn't find the
extended one). Whether it's useful ... Currently I'm rather interested
in if it's possible.

Regards,
Thomas.