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