从 gem 扩展模块而不是猴子修补

Extending Modules from a gem instead of monkey patching

假设 "clean" Ruby 猴子补丁不是一个选项,并且所有 gem 扩展方法都需要完全包含在它们自己的命名空间中,并给出类似

module ARubyGem
  class GemClassOne
    def method1
      # instance method to be available when calling extended module 
    end
    def self.method2
      # singleton method to also be available in extended module
    end
  end
end

如果原始 gem 代码有一些以 "self" 开头的单例方法,那么哪一个是扩展 gem 的更好方法?

module ARubyGemExtension
  class GemClassOneExtension < ARubyGem::GemClassOne
    def method_to_override
      # new code here
    end
  end
end

对比

module ARubyGemExtension
  include ARubyGem 
  class GemClassOneExtension
    def method_to_override
      # new code here
    end
  end
end

看来您需要:

  module ARubyGemExtension
    class GemClassOneExtension < ARubyGem::GemClassOne
      def method_to_override
        # new code here
      end
    end
  end

(记住命名空间 GemClassOne。)

我对您正在使用的 gem 一无所知,但除非它专门设置为通过 include 提供方法,否则我认为您可能无法得到您想要的.