--Boundary_(ID_vDhjaQW4AuHy5pCqExPKGA) Content-type: text/plain; charset=iso-8859-1 Content-transfer-encoding: quoted-printable On Aug 11, 2010, at 11:11 AM, Jesù¸ Gabriel y GaláÏ wrote: > On Wed, Aug 11, 2010 at 5:32 PM, Chuck Remes <cremes.devlist / mac.com> wrote: >> I'd like to reopen a class Foo and redefine one of its methods to use an instance method from class Bar. I can't seem to figure out how to do it or even if it is possible. >> >> I tried lots of different techniques and none have worked, so here I am asking for a bit of help. An example of one of the techniques I tried is included below. >> [snip] >> I would like Foo.now to return Time.now.to_i for the normal case. However, after an instance of Bar is created, I would like the Bar instance to redefine Foo.now to call the #now instance method of Bar. >> >> This is what the output should look like: >> >> ruby-1.9.1-p378 > Foo.now >> => 1281540640 >> ruby-1.9.1-p378 > Bar.new >> bar now >> => #<Bar:0x00000101216268 @bar=#<Proc:0x000001012161c0@(irb):41>> >> ruby-1.9.1-p378 > Foo.now >> => "bar now called" > > I've managed to do it with a local variable, instead of an instance variable: > > class Foo > def self.now > "Foo's now" > end > end > > class Bar > def initialize > bar = proc {now} > class << Foo; self; end.class_eval do > define_method(:now) do > bar.call > end > end > end > > def now > "Bar's now" > end > end > > puts Foo.now > puts Bar.new.now > puts Foo.now > > $ ruby redefine.rb > Foo's now > Bar's now > Bar's now > > The problem with an instance variable is that you need to have self as > Bar's instance in order for it to work. So if you can use a local > variable and use closures, it will work, as shown above. Ah, excellent! I was trying to figure out how to use a closure for this purpose, but my mind got all turned inside out. I'm somewhat familiar with getting the singleton class of a class using the "class << self;self;end" syntax, but I'm not sure what is happening here: class << Foo self # what is self here? Foo? Bar? instance of Bar? end My inline questions lay it out. I'd really like to understand how that part of it is working. I understand the mechanics of the remaining code. cr --Boundary_(ID_vDhjaQW4AuHy5pCqExPKGA)--