2

我的印象是细化超出了 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

我的问题是,怎么做?细化是否以某种方式插入到类层次结构中?

4

1 回答 1

2

根据文档,细化内置行为的方法查找与您观察到的相同。

您的假设是正确的,它不是典型的继承,可以通过调用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
于 2015-10-12T06:51:28.307 回答