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

时间:2016-04-20 14:29:47

标签: ruby extension-methods

假设"清洁" Ruby monkey补丁不是一个选项,所有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

如果原始宝石代码有一些以" self"

开头的单例方法,那么这些是扩展gem的更好方法
module ARubyGemExtension
  class GemClassOneExtension < ARubyGem::GemClassOne
    def method_to_override
      # new code here
    end
  end
end

VS

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

1 个答案:

答案 0 :(得分:1)

好像你需要一起去:

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

(请记住命名空间GemClassOne。)

我对您正在使用的宝石一无所知,但除非专门设置通过include提供方法,否则我认为您可能无法获得所追求的宝石。