ruby - 如何限制 block 被调用的次数?

标签 ruby block

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”,否则为 $&)。是否可以将两者分开?

(如果在这种情况下很难将这两件事分开,但在其他一些情况下可以做到,请将其作为答案发布)

最佳答案

将替换项提取为参数并通过在方法中关闭 block 来封装计数器怎么样?

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))

您可以通过使用 block 进行替换来使其更加通用:

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))

关于ruby - 如何限制 block 被调用的次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6024525/

相关文章:

ruby - OpenStruct 和 Hash 之间有哪些重要区别?

html - 在 HTML5 中,<div> 从技术上讲是 block 级元素,但其行为类似于内联元素。这是一个特殊的 'hybrid' 元素吗?

mysql - MySQL 上的 Firebird 执行 block

swift - 在 Swift 中调用自定义闭包

java RTFEditorKit : chaining blocks of text

objective-c - Swift 中的完成 block 语法

ruby - 未设置的 Sinatra 和 session 变量

javascript - 为什么我的表单没有提交我想要的内容?

mysql - 使用 Ruby 拆分 MySQL 查询的行并写入 CSV 文件

ruby - 检测不同分辨率下的图像是否相等