通过创建的方法调用时alias_method
,__callee__
忽略旧方法的名称(此处xxx
)并返回新方法的名称,如下所示:
class Foo
def xxx() __callee__ end
alias_method :foo, :xxx
end
Foo.new.foo # => :foo
即使xxx
从超类继承,这种行为也成立:
class Sup
def xxx() __callee__ end
end
class Bar < Sup
alias_method :bar, :xxx
end
Bar.new.bar # => :bar
鉴于上述两种情况,我希望xxx
通过模块包含相同的行为。然而,事实并非如此:
module Mod
def xxx() __callee__ end
end
class Baz
include Mod
alias_method :baz, :xxx
end
Baz.new.baz # => :xxx
我希望返回值是:baz
,不是:xxx
。
上面的代码是使用 Ruby 2.3.1p112 执行的。这是实现中的错误__callee__
吗?或者也许是alias_method
?如果没有,谁能解释为什么模块包含的行为不同?
更新 1
我已将此发布到 Ruby 错误跟踪器,以试图激起答案。
更新 2
显然,我不是唯一一个对这个问题感到惊讶的人。我想知道修订版 50728(旨在解决错误 11046:__callee__
在 orphan proc 中返回不正确的方法名称)是否相关。