によって作成されたメソッドを介して呼び出された場合、 は古いメソッドの名前 (ここでは )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__
孤立した proc で不正なメソッド名を返す) を解決するためのものでした) が関連しているのではないかと思います。