如何动态覆盖方法

时间:2015-12-30 02:42:28

标签: ruby methods metaprogramming

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

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

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

def f
  require 'my_hash.rb'
end

我想知道是否有办法避免添加单独的文件。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

这是另一种方法:

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