【问题标题】:How to overwrite a method dynamically如何动态覆盖方法
【发布时间】:2016-04-03 23:56:06
【问题描述】:

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

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

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

def f
  require 'my_hash.rb'
end

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

【问题讨论】:

    标签: ruby methods metaprogramming


    【解决方案1】:

    这是另一种方法:

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

    【讨论】:

      【解决方案2】:
      def f
        Hash.send(:define_method, :[]=) do |x, y|
          ...
        end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-24
        • 2018-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-14
        • 1970-01-01
        相关资源
        最近更新 更多