Sean O'Halpin
7/19/2006 2:56:00 AM
On 7/19/06, transfire@gmail.com <transfire@gmail.com> wrote:
>
> Sean O'Halpin wrote:
> > On 7/18/06, Trans <transfire@gmail.com> wrote:
> > >
> > > On a side note I think I found a bug in Ruby, maybe
> > >
> > > class X
> > > def self.method_added(name)
> > > p name
> > > end
> > > end
> > >
> > > class X
> > > def x; end
> > > end
> > > => :x
> > >
> > > class << X
> > > undef_method :method_added
> > > end
> > >
> > > class X
> > > def y; end
> > > end
> > > => NoMethodError: undefined method `method_added' for X:Class
> > >
> > >
> > > </Trans>
> > >
> > >
> > Is it a bug? You are undef'ing it after all. remove_method would seem
> > more appropriate in this use case.
> >
> > But maybe a warning like "undefining `method_added' may cause serious
> > problem" like for __send__, __id__, etc. might be in order.
>
> Weel, yea sort of. B/c look at what happended to me. I defined my own
> method_added in a paritcular class, and in order to prevent an infinite
> loop I need to undefine it in a subclass of it. I.e.
>
> class X
> def method_added
> ... this might define a method in a Y
> end
> end
>
> class Y < X
> remove_method :method_added # goes right back to infinite loop
> undef_method :method_added # bombs per our "bug"
> def method_added; end # what I ended up with
> end
>
> So there's an easy fix but it's seems a bit wasteful. One wuould expect
> undef to work and save a call to a noop. Butmaybe it's more efficeint
> to just make the call to the noop then it is to see if it's present? I
> somehow doubt it though. In whihc case I say it's a minor bug.
>
> T.
>
Having thought about it a bit more, I'm inclined to agree. There's no
(logical) reason why method_added should be called if you don't define
it yourself, so it seems reasonable to be able to undef it completely
from a class without side-effects.
Regards,
Sean