"restoring" classes after changing stuff

Hi,

Well, I’m new to Ruby (I’ve been working and playing with it for the
last 6 months only), and
I know there’s probably another way in which this could work, but
somehow I feel like the
code below should work. Let’s see what you guys think about it.

The idea is making a copy of a class object, changing it and then
restoring it back to what it was after playing with the new stuff I
added. It should go somewhat like this:

OldArray = Array.dup

=> OldArray

class Array
def my_method; “My Method”; end
end

=> nil

[].my_method

=> “My Method”

x = Array.new

=> []

x.my_method

=> “My Method”

Switch back

Array = OldArray.dup
(irb):9: warning: already initialized constant Array

=> Array

x.my_method

=> “My Method”

(Ok, now why did that work? Maybe “x” is still using the modified Array
class?)

[].my_method

=> “My Method”

(Same thing here, it seems)

[1, 2, 3].my_method

=> “My Method”

(Hmmmm, let’s try something different)

x = Array.new

=> []

x.my_method
NoMethodError: undefined method `my_method’ for []:Array
from (irb):14
from :0

(Ok, so new instances only? Is this weird at all, or is this the way
it’s supposed to work?)

I’m asking these questions out of real lack of knowledge, and I REALLY
don’t suppose
something should change in order to make this work. I’m just trying to
understand how
Ruby does all this stuff.

Thank you in advance,
Marcelo A…

On Tue, 17 Apr 2007, Marcelo A. wrote:

added. It should go somewhat like this:

you can’t easily undo class changes. better to not make them in the
first
place. this will work

harp:~ > cat a.rb
module ProxyClass
def self.new parent
Class.new(parent) do
const_set :PARENT, parent
instance_methods.each{|m| undef_method m unless m[%r/__/]}
c = self and define_method(:class){ c }
def method_missing m, *a, &b
self.class::PARENT.instance_method(m).bind(self).call(*a, &b)
end
end
end
end
class Class
def proxy() ProxyClass.new(self) end
end

A = Array.proxy

class A
def foo() :foo end
end

a = A[ 0, 1, 2 ]

p a.class
p a[0]
p a.first(2)
p a.foo

harp:~ > ruby a.rb
A
0
[0, 1]
:foo

regards.

-a