ruby self.inherited alias_method

class Base
  def sam
    "I m the base"
  end

  def self.inherited(base)
    alias_method :old_sam, :sam
    base.class_eval do
      def sam
        old_sam 
        p "Inside inherited"
      end
    end
    super
  end
end

class Derived < Base
  def sam
   p "Inside Derived"
  end
end

когда Derived.new.sam => "Внутри производных"

Но я ожидаю

"Внутри производных"

"Внутри по наследству"

Новое в рубине. Любая помощь будет оценена.

1 ответ

Вы просто переопределили base.class_eval метод sam в Derived,

Если вы удалите метод sam от Derived:

class Derived < Base
end

Ты получишь:

#=> "Inside inherited"
#=> ArgumentError: wrong number of arguments (given 1, expected 0)

Последнее потому, что вы передаете аргумент old_sam метод, который не принимает его:

old_sam p "Inside inherited"

Но я ожидаю

"Внутри производных"

"Внутри по наследству"

Это невозможно с вашей настройкой, потому что вы сначала определяете метод экземпляра sam в class_eval блок для всех нисходящих классов, но позже просто переопределяет в.

Другие вопросы по тегам