Feature #13574
openMethod redefinition warning
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
Updated by matthewd (Matthew Draper) over 7 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 7 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 7 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.
Updated by jeremyevans0 (Jeremy Evans) about 5 years ago
- Backport deleted (
2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN) - Tracker changed from Bug to Feature
- ruby -v deleted (
ruby 2.5.0dev (2017-03-22 gc-compact 58059) [x86_64-darwin16])