При вызове через метод, созданный 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__
возвращает неверное имя метода в потерянном процессе) может быть связано.
__method__
. - person Nils Landt   schedule 09.02.2016__method__
? Я заменил__callee__
на__method__
и получилxxx
во всех трех случаях. Отличается ли он в Ruby 2.2? - person user513951   schedule 09.02.2016