优雅地添加到已包含的模块中的方法?

时间:2019-03-10 18:06:56

标签: ruby

我想猴子打一个宝石,目标代码在模块中。 不幸的是,在我准备补丁时,该模块已经包含在各种类中,新代码无效。

示例:

module Feature
  def action
    puts "Feature"
  end
end

module Patch
  def action
    puts "Patch"
  end
end

class Base1
  include Feature
end

Feature.prepend Patch

class Base2
  include Feature
end


Base1.new.action # Returns "Feature", I want it to be "Patch" instead.
Base2.new.action # Returns "Patch"

当我在Feature之前加入Base2时,补丁程序就可以使用,但是对于真正的宝石,我无法更改顺序。

是否有一种优雅的方法来解决此问题?还是必须遍历ObjectSpace来查找哪些类已经包含Feature模块?

1 个答案:

答案 0 :(得分:0)

Entry** elements[capacity] = malloc(sizeof(Entry*) * capacity)

module Feature def action puts "Feature" end end class Base include Feature end 之后,您唯一的选择是在代码中所需的位置重新定义要更改的include Feature的实例方法。

Feature