怎么能超级"在一个细化中调用一个重写方法?

时间:2015-10-12 03:44:25

标签: ruby refinements

我的印象是,改进不属于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 个答案:

答案 0 :(得分:2)

基于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