Project

General

Profile

Feature #13574

Method redefinition warning

Added by tenderlovemaking (Aaron Patterson) over 2 years ago. Updated 27 days ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:81230]

Description

Hi,

If I redefine a method like this, I get a warning:

class Foo
  def bar
  end
end

class Foo
  def bar
  end
end

If I alias the method to a different name, I don't get a warning:

class Foo
  def bar
  end
end

class Foo
  alias :foo :bar

  def bar
  end
end

I think this is expected. However, if I alias the method to itself, I don't get a warning:

class Foo
  def bar
  end
end

class Foo
  alias :bar :bar

  def bar
  end
end

I think this case should cause a warning.


Files

warn-on-same-name-alias.diff (425 Bytes) warn-on-same-name-alias.diff tenderlovemaking (Aaron Patterson), 05/19/2017 12:07 AM

History

Updated by matthewd (Matthew Draper) over 2 years ago

As there's no other way to silence the redefinition warning (apart from removing the method first, which isn't atomic), the fact aliases silence it is very useful.

As a special case, aliasing it back to itself is particularly helpful for this purpose: it avoids polluting the method table with extra names, and is a clear indication we're not actually trying to give the method another name.

I don't know whether it was originally intended to work this way, but I think it is useful enough to keep. I also think a warning is unnecessary because it's not a likely error for a developer to make: there is no similar code that would make more sense.

Updated by Eregon (Benoit Daloze) over 2 years ago

matthewd (Matthew Draper) wrote:

apart from removing the method first, which isn't atomic

What do you mean?
That remove_method + new definition is not atomic?

Updated by matthewd (Matthew Draper) over 2 years ago

What do you mean?
That remove_method + new definition is not atomic?

Yes. Using remove_method + define_method, a concurrent thread may get a NoMethodError. In contrast, using alias_method + define_method, while the other thread could obviously call either the old or new definition (depending on exact timing), there will always be a method there.

#4

Updated by jeremyevans0 (Jeremy Evans) 27 days ago

  • Backport deleted (2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN)
  • ruby -v deleted (ruby 2.5.0dev (2017-03-22 gc-compact 58059) [x86_64-darwin16])
  • Tracker changed from Bug to Feature

Also available in: Atom PDF