如何正确地monkeypatch Ruby?

pic*_*rdo 7 ruby monkeypatching ruby-on-rails-3

我正在尝试在标准库中对Net类中的一行进行monkeypatch.我在项目的lib文件夹中创建了一个名为patches.rb的文件并添加了它

module Net
  class HTTP < Protocol
    module HTTPHeader
      def initialize_http_header(initheader)
        @header = {}
        return unless initheader
        initheader.each do |key, value|
          @header[key.downcase] = [value.strip] rescue ""
        end
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我这样做了吗?(这与继承层次结构完全相同.)

编辑:部分问题是我必须将文件放在initalizers文件夹中.但仍然看到同样的错误.

tad*_*man 10

由于lib/目录中的内容只是按需config/initializers/加载,因此在初始化堆栈后,将这样的补丁放在自动加载的位置可能会更成功.

您还可以将扩展的定义折叠为以下内容:

module Net::HTTP::HTTPHeader
  # ... (redefined methods) ...
end
Run Code Online (Sandbox Code Playgroud)

  • monkeypatch错误的东西很容易,所以你应该总是仔细检查你的目标的名称空间.我看了一下`net/http.rb`它应该是`Net :: HTTPHeader`你要重新定义方法,而不是`Net :: HTTP :: HTTPHeader`. (3认同)