加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 如何限制块的调用次数?

发布时间:2020-12-16 19:23:10 所属栏目:百科 来源:网络整理
导读:在 How do I limit the number of replacements when using gsub?,有人建议采用以下方式进行有限数量的替换: str = 'aaaaaaaaaa'count = 5p str.gsub(/a/){if count.zero? then $ else count -= 1; 'x' end}# = "xxxxxaaaaa" 它可以工作,但代码混合了多少次
在 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))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读