在
How do I limit the number of replacements when using gsub?,有人建议采用以下方式进行有限数量的替换:
str = 'aaaaaaaaaa' count = 5 p str.gsub(/a/){if count.zero? then $& else count -= 1; 'x' end} # => "xxxxxaaaaa"
它可以工作,但代码混合了多少次替换(5)替换应该是什么(“x”如果应该有替换,$&否则).有可能把这两个分开吗?
(如果在这种情况下很难将这两件事分开,但可以在其他一些场景中完成,将其作为答案发布)
解决方法
如何将替换作为参数提取并通过在方法内使块关闭来封装计数器?
str = "aaaaaaaaaaaaaaa" def replacements(replacement,limit) count = limit lambda { |original| if count.zero? then original else count -= 1; replacement end } end p str.gsub(/a/,&replacements("x",5))
您可以通过使用块替换来使其更加通用:
def limit(n,&block) count = n lambda do |original| if count.zero? then original else count -= 1; block.call(original) end end end
现在你可以做类似的事情
p str.gsub(/a/,&limit(5) { "x" }) p str.gsub(/a/,&limit(5,&:upcase))