When invoked via a method created by alias_method
, __callee__
ignores the name of the old method (here xxx
) and returns the name of the new method, as below:
class Foo
def xxx() __callee__ end
alias_method :foo, :xxx
end
Foo.new.foo # => :foo
This behavior holds even when xxx
is inherited from a superclass:
class Sup
def xxx() __callee__ end
end
class Bar < Sup
alias_method :bar, :xxx
end
Bar.new.bar # => :bar
Given both of the above, I would expect that the same behavior would hold when xxx
is included via a module. However, that is not the case:
module Mod
def xxx() __callee__ end
end
class Baz
include Mod
alias_method :baz, :xxx
end
Baz.new.baz # => :xxx
I expect the return value to be :baz
, not :xxx
.
The above code was executed using Ruby 2.3.1p112. Is this a bug in the implementation of __callee__
? Or maybe of alias_method
? And if not, can anyone explain why module inclusion behaves differently?
UPDATE 1
I've posted this to the Ruby bug tracker to try to stir up an answer.
UPDATE 2
Apparently, I'm not the only one to be surprised by this issue. I wonder whether Revision 50728 (which was meant to solve Bug 11046: __callee__
returns incorrect method name in orphan proc) might be related.