举个例子先:
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的部分类想做个调整。至于什么时候用,不应该经常用。