背景:我需要确定远程位置的记录数。记录按顺序编号(从 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
这是我的尝试:
带有显式计数器变量的
while
循环显然可以工作,但我看起来不是很地道:i = 0 i += 1 while fetch_record(i) i #=> 3
我可以使用带有显式结果值的
step
和break
但这看起来很麻烦:0.step(by: 1).each { |i| break i unless fetch_record(i) } #=> 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/