From: Daniel DeLorme Date: 2008-10-04T23:04:44+09:00 Subject: Re: No warning for redefine Ragav Satish wrote: > Daniel DeLorme wrote: >> David A. Black wrote: >>> On Fri, 3 Oct 2008, Han Holl wrote: >>>> Shouldn't the following: >> [snip] >>>> produce something like: >>>> >>>> demo.rb:9: warning: method redefined; discarding old function >>>> >>>> Behaviour now is to discard the mixed-in method silently. >>> It's not discarded; it's still there (in the module) and you can use >>> it with other classes, or reach it through 'super' in the override. >> But since the override doesn't use super, in effect it has the same >> effect as discarding the included 'function', at least as far as the >> main object is concerned. I wish ruby would output a warning for cases >> like this, i.e. "warning: method `foo' ignores method defined in >> /path/to/file.rb:123" > > The behavior is unsurprising if you think of inheritance when you see > Module inclusion. If on the other hand if your mental model is "copying > methods" from the Module into the target then I can see the confusion. > > You don't expect warnings when a derived class overrides a base class > method now do you? Not if the derived class invokes 'super'. But if it doesn't, it can indicate a problem. For example, maybe you coincidentally chose a method name that clashes with the superclass. Or maybe someone later adds a method with the same name to the superclass (e.g. initialize). For 1.9, a different method lookup scheme for private methods was proposed to address that problem. Ultimately it was too big of a change and didn't make it into 1.9, but I think it's a recognized problem, especially when mixing libraries that extend the core classes. -- Daniel