Method redefinition warning
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.
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 matthewd (Matthew Draper) about 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.