Valor inesperado de __callee__ cuando se incluye un módulo: ¿es esto un error de Ruby?
Cuando se invoca a través de un método creado poralias_method
, __callee__
ignora el nombre del método anterior (aquíxxx
) y devuelve el nombre del nuevo método, como se muestra a continuación:
class Foo
def xxx() __callee__ end
alias_method :foo, :xxx
end
Foo.new.foo # => :foo
Este comportamiento se mantiene incluso cuandoxxx
se hereda de una superclase:
class Sup
def xxx() __callee__ end
end
class Bar < Sup
alias_method :bar, :xxx
end
Bar.new.bar # => :bar
Dado lo anterior, esperaría que el mismo comportamiento se mantuviera cuandoxxx
Se incluye a través de un módulo. Sin embargo, este no es el caso:
module Mod
def xxx() __callee__ end
end
class Baz
include Mod
alias_method :baz, :xxx
end
Baz.new.baz # => :xxx
Espero que el valor de retorno sea:baz
no:xxx
.
El código anterior se ejecutó usando Ruby 2.3.1p112. ¿Es esto un error en la implementación de__callee__
? O tal vez dealias_method
? Y si no, ¿alguien puede explicar por qué la inclusión de módulos se comporta de manera diferente?
ACTUALIZACIÓN 1
Hepublicó esto en el rastreador de errores Ruby para tratar de agitar una respuesta.
ACTUALIZACIÓN 2
Aparentemente soyNo el único estar sorprendido por este problema. me pregunto siRevisión 50728 (que estaba destinado a resolverBug 11046:__callee__
devuelve un nombre de método incorrecto en el proceso huérfano) podría estar relacionado.