Quando viene richiamato tramite un metodo creato da alias_method
, __callee__
ignora il nome del vecchio metodo (qui xxx
) e restituisce il nome del nuovo metodo, come di seguito:Valore inatteso di __callee__ quando si include un modulo - si tratta di un bug di Ruby?
class Foo
def xxx() __callee__ end
alias_method :foo, :xxx
end
Foo.new.foo # => :foo
Questo comportamento vale anche quando xxx
viene ereditato da una superclasse:
class Sup
def xxx() __callee__ end
end
class Bar < Sup
alias_method :bar, :xxx
end
Bar.new.bar # => :bar
Dato sia di quanto sopra, mi sarei aspettato che lo stesso comportamento sarebbe tenere quando xxx
è incluso tramite un modulo. Tuttavia, questo non è il caso:
module Mod
def xxx() __callee__ end
end
class Baz
include Mod
alias_method :baz, :xxx
end
Baz.new.baz # => :xxx
mi aspetto che il valore di ritorno per essere :baz
, non :xxx
.
Il codice precedente è stato eseguito utilizzando Ruby 2.3.1p112. Si tratta di un bug nell'implementazione di __callee__
? O forse di alias_method
? E se no, qualcuno può spiegare perché l'inclusione del modulo si comporta diversamente?
UPDATE 1
ho posted this to the Ruby bug tracker per cercare di suscitare una risposta.
UPDATE 2
A quanto pare, io sono not the only one di essere sorpresi da questo problema. Mi chiedo se Revision 50728 (che doveva risolvere Bug 11046: __callee__
returns incorrect method name in orphan proc) possa essere correlato.
Molto interessante, decisamente cambiato tra 2.2 e 2.3. Lo stesso per '__method__'. –
@NilsLandt Puoi dare un esempio del comportamento di '__method__'? Ho sostituito '__callee__' con' __method__' e ho ottenuto 'xxx' restituito per tutti e 3 i casi. È diverso in Ruby 2.2? –