Unerwarteter Wert von __callee__ beim Einbinden eines Moduls - ist das ein Ruby-Fehler?
Wenn über eine von @ erstellte Methode aufgerufalias_method
, __callee__
ignoriert den Namen der alten Methode (hierxxx
) und gibt den Namen der neuen Methode wie folgt zurück:
class Foo
def xxx() __callee__ end
alias_method :foo, :xxx
end
Foo.new.foo # => :foo
Dieses Verhalten gilt auch, wennxxx
wird von einer Superklasse geerbt:
class Sup
def xxx() __callee__ end
end
class Bar < Sup
alias_method :bar, :xxx
end
Bar.new.bar # => :bar
Wenn beide oben genannten Bedingungen erfüllt sind, würde ich davon ausgehen, dass dasselbe Verhalten gilt, wennxxx
wird über ein Modul eingebunden. Dies ist jedoch nicht der Fall:
module Mod
def xxx() __callee__ end
end
class Baz
include Mod
alias_method :baz, :xxx
end
Baz.new.baz # => :xxx
Ich erwarte, dass der Rückgabewert @ i:baz
, nicht:xxx
.
Der obige Code wurde mit Ruby 2.3.1p112 ausgeführt. Ist das ein Fehler in der Implementierung von__callee__
? Oder vielleicht vonalias_method
? Und wenn nicht, kann jemand erklären, warum sich die Moduleinbeziehung anders verhält?
UPDATE 1
Ich habeat dies im Ruby Bug Tracker gepost, um eine Antwort zu finden.
UPDATE 2
nscheinend bin ichNicht der einzig von diesem Problem überrascht zu sein. Ich frage mich obRevision 50728 (das sollte lösen Bug 11046:__callee__
gibt in orphan proc @ einen falschen Methodennamen zurü) könnte verwandt sein.