如何动态覆盖方法

How to overwrite a method dynamically

我想通过调用方法 f 动态覆盖方法 Hash#[]=。以下代码不起作用,因为方法内部不允许 class 定义:

def f
  class Hash
    def []=(k, v)
      ...
    end
  end
end

解决方法是将 class Hash 放在单独的文件中,然后

def f
  require 'my_hash.rb'
end

不知道有没有办法避免添加单独的文件。

def f
  Hash.send(:define_method, :[]=) do |x, y|
    ...
  end
end

这是另一种方法:

def f
    Hash.class_eval do
        def []=(k, v)
          #...
        end
    end
end