[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

No warning for redefine

Han Holl

10/3/2008 11:47:00 AM

[Note: parts of this message were removed to make it a legal post.]

Hi,

Shouldn't the following:

#!/usr/bin/ruby -w

module Mixin
def function
puts 'Mixin'
end
end
include Mixin
def function
puts 'Main'
end

function
# end of demo.rb

produce something like:

demo.rb:9: warning: method redefined; discarding old function

Behaviour now is to discard the mixed-in method silently.

Cheers,

Han Holl

6 Answers

David A. Black

10/3/2008 11:59:00 AM

0

Hi --

On Fri, 3 Oct 2008, Han Holl wrote:

> Hi,
>
> Shouldn't the following:
>
> #!/usr/bin/ruby -w
>
> module Mixin
> def function
> puts 'Mixin'
> end
> end
> include Mixin
> def function
> puts 'Main'
> end
>
> function
> # end of demo.rb
>
> 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.
Discarding means you can never get to a method again:

class C
def m
end
def m # Previous m is now completely uncallable
end
end


David

--
Rails training from David A. Black and Ruby Power and Light:
Intro to Ruby on Rails January 12-15 Fort Lauderdale, FL
Advancing with Rails January 19-22 Fort Lauderdale, FL *
* Co-taught with Patrick Ewing!
See http://www.r... for details and updates!

Han Holl

10/3/2008 2:04:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

> 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.
> Discarding means you can never get to a method again:
>

Of course! How stupid of me.

Thanks,

Han Holl

Daniel DeLorme

10/4/2008 3:31:00 AM

0

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"

--
Daniel

ragav

10/4/2008 3:55:00 AM

0

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?

--Ragav
--
Posted via http://www.ruby-....

Daniel DeLorme

10/4/2008 2:05:00 PM

0

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

David A. Black

10/4/2008 2:16:00 PM

0

Hi --

On Sat, 4 Oct 2008, 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"

Yikes. Be careful what you wish for :-) That would put a damper on a
lot of code, as well as slowing things down (the 'super' determination
could only be made at runtime) and spewing endless errors. For
example:

{}.select ...

would give you a warning, because the Hash override of
Enumerable#select does not call super.

There's absolutely nothing fishy or wrong with not calling super, so
there's nothing to warn about. The whole object/class model of Ruby is
based on the idea of a method search-path, to which you can prepend
classes and modules precisely to prevent the execution of earlier
definitions of methods. Any issues with name clashing and such (of
which there shouldn't be many, if any, since you'd presumably be
familiar with the class you're inheriting from) would be exposed by
tests.


David

--
Rails training from David A. Black and Ruby Power and Light:
Intro to Ruby on Rails January 12-15 Fort Lauderdale, FL
Advancing with Rails January 19-22 Fort Lauderdale, FL *
* Co-taught with Patrick Ewing!
See http://www.r... for details and updates!