那是我朝阳下的奔跑 -- Ruby的 Monkey Patching 游击布丁

浏览: 173 发布日期: 2017-07-31 分类: ruby

举个例子先:

Ruby array里面有一个each的方法,每次yield一个内容。像是这样:

    ["a", "b", "c"].each{ |str| puts str}

如果我们想每次得到的字符串后面添加一个pipe,我们可以这样:

    ["a", "b", "c"].each{ |str| new_str = str + "|"; puts new_str}

如果我们想把这个pipe做成一个大家都可以用的方法,对每一个array都能使用的方法。我们就可以做一个游击布丁,像这样:

      class Array
          def my_monkey_patch
               each do |e|
                  if e.is_a? String
                    yield e + "!"
                  else
                    yield e
                  end
                end
           end
      end
      
      # 猜猜这两个分别输出什么呢?
      ["a", "b"].my_monkey_patch do |str|
          p str
      end

      [1, 2, 3].my_monkey_patch{ |i| puts i}

这种补丁可以打在instance method上,也可以打在class method上。我一般使用这种patch的时候是想对某个gem的部分类想做个调整。至于什么时候用,不应该经常用。

返回顶部