Sean O'Halpin
7/14/2006 12:08:00 PM
On 7/14/06, Robert Dober <robert.dober@gmail.com> wrote:
> On 7/14/06, Sean O'Halpin <sean.ohalpin@gmail.com> wrote:
> >
> > On 7/14/06, ara.t.howard@noaa.gov <ara.t.howard@noaa.gov> wrote:
> > > On Fri, 14 Jul 2006 transfire@gmail.com wrote:
> > >
> > > > (class << File; self; end).instance_eval {
> > > > define_method(:open,&open_m)
> > > and the block?
> > >
> > > -a
> > > --
> > > suffering increases your inner strength. also, the wishing for
> > suffering
> > > makes the suffering disappear.
> > > - h.h. the 14th dali lama
> > >
> > I had to cheat ;)
> >
> > File::OPEN_M = open_m
> > class File
> > eval "
> > def self.open(*args, &block)
> > OPEN_M.call(*args, &block)
> > end
> > "
> > end
> >
> > The problem is - as I'm sure you know - that define_method doesn't
> > honour the block argument of the method reference. I'd be very
> > interested to see if you can do it cleanly in ruby 1.8.
> >
> > Regards,
> > Sean
> >
> >
> Block behavior is preserved though when we store a reference to a method
> e.g.
> ----------------------- 8< ------------------------------
> class X
> def x(*args,&block)
> block.call(1764) if block
> end
> end
>
> OLD = X.instance_method :x
>
> class X
> def x; "rubbish"; end
> end
>
> class X
>
> define_method(:x, OLD )
>
> end
>
> X.new.x{ |a| puts a }
> ----------------------- >8 ----------------------------------
>
> That should do the trick, no?
> But I *cannot* make it work with IO :(, some internal magic, maybe?
>
> Cheers
> Robert
>
>
Excellent. Don't use the & to convert the Proc into a block - just use
the method reference directly.
Are you getting the "singleton method called for a different object
(TypeError)" error?
Thanks,
Sean