Как "супер" в уточнении может вызвать переопределенный метод?

У меня сложилось впечатление, что доработки выходят за рамки обычной схемы наследования в Ruby; что переопределение метода в уточнении заменило исходный метод для всего кода, использующего уточнение.

Но потом я попробовал этот эксперимент с superи оказывается, что переопределенный метод вызывается:

class MyClass
  def my_instance_method
    puts "MyClass#my_instance_method"
  end
end

module MyRefinement
  refine(MyClass) do
    def my_instance_method
      puts "MyClass#my_instance_method in MyRefinement"
      super
    end
  end
end

using MyRefinement
MyClass.new.my_instance_method

Вышеприведенный код выводит:

MyClass#my_instance_method in MyRefinement
MyClass#my_instance_method

У меня вопрос как? Вставлено ли уточнение в иерархию классов каким-либо образом?

1 ответ

Решение

Основываясь на документации, поиск метода для встроенного поведения уточнения такой же, как вы наблюдали.

Ваше предположение было верным, что это не типичное наследование, которое можно увидеть, вызвав superclass

class C
  def foo
    puts "C#foo"
  end
end

module M
  refine C do
    def foo
      puts "C#foo in M"
      puts "class: #{self.class}"
      puts "superclass: #{self.class.superclass}"
      super
    end
  end
end

using M

x = C.new

x.foo

Выход:

C#foo in M
class: C
superclass: Object
C#foo
Другие вопросы по тегам