Daniel DeLorme
10/4/2008 2:05:00 PM
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