Question about how ruby sources is parsed

T

ThoML

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

Jason Roelofs

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
 
T

ThoML

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

Jari Williamsson

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
 
E

Eric Hodel

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.

You can't do this without modifying the interpreter.
 

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,770
Messages
2,569,583
Members
45,073
Latest member
DarinCeden

Latest Threads

Top