ruby - 计算一个方法可以被调用多少次直到它返回 nil

标签 ruby

背景:我需要确定远程位置的记录数。记录按顺序编号(从 0 开始,没有间隔),只能根据编号一条一条地取。

通过网络获取记录的方法在成功时返回一个truthy 值,在失败时返回一个falsey 值。这是一个例子:

fetch_record(0) #=> true (record #0 exists)
fetch_record(1) #=> true (record #1 exists)
fetch_record(2) #=> true (record #2 exists)
fetch_record(3) #=> nil  (no record #3)

我试图找到一种优雅的方法来计算我可以调用多少次 fetch_record 并增加参数直到它返回 nil (在上面的例子中是 3 次) .

到目前为止我尝试了什么

考虑到出于测试目的的这种简化实现:

def fetch_record(index)
  raise if index > 3 # just to prevent endless loops
  true if index < 3
end

这是我的尝试:

  1. 带有显式计数器变量的 while 循环显然可以工作,但我看起来不是很地道:

    i = 0
    i += 1 while fetch_record(i)
    i
    #=> 3
    
  2. 我可以使用带有显式结果值的 stepbreak 但这看起来很麻烦:

    0.step(by: 1).each { |i| break i unless fetch_record(i) }
    #=> 3
    
  3. 懒惰的枚举器更糟:

    0.step(by: 1).lazy.map { |i| fetch_record(i) }.take_while(&:itself).count
    #=> 3
    

是否有更简单的方法来完成上述操作?

最佳答案

假设您可以自由地以相反的方式实现fetch_record,为不存在的记录返回true:

def fetch_record index
  index >= 3
end
(0..Float::INFINITY).detect &method(:fetch_record)
#⇒ 3

关于ruby - 计算一个方法可以被调用多少次直到它返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33936186/

相关文章:

ruby-on-rails - 在 Ruby 中打开并读取 Google Drive 中的文件

数组中的 Ruby 差异包括重复项

ruby-on-rails - 如何在 Ruby 脚本中使用 ActionMailer 而不是 Rails 应用程序

css - 在使用 SASS 的现有元素中找不到 config.rb

ruby - 使用 VCR 过滤掉 JWT 和 Bearer token

ruby - 编码挑战

Ruby 方法如 `self` 引用实例

ruby-on-rails - Rails - 使用带有自定义命名关联的连接

ruby - 使用 RegExp 格式化字符串以设置分隔符

ruby - 带有 OAuth2 : update and delete fail with "Insufficient Permission" error 的 YouTube API v3