"super" 如何在细化中调用重写的方法?

How can "super" within a refinement call an overridden method?

我的印象是,改进超出了 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

我的问题是,如何?细化是否以某种方式插入到 class 层次结构中?

基于 documentation,细化的内置行为的方法查找与您观察到的相同。

您的假设是正确的,它不是典型的继承,可以通过调用 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