如何实现Ruby中2.times.each_second { p 'works' }功能?
实现
2.times.each_second { p 'works' }的思路与代码 要实现这个需求,核心是给Enumerator扩展一个each_second方法,让枚举器的每次迭代间隔1秒执行,同时利用2.times返回的枚举器自身携带的循环次数信息来控制休眠逻辑。
方案一:利用枚举器的size属性
Integer#times返回的枚举器有明确的size值(就是你传入的数字,比如这里的2),我们可以基于这个特性实现:
class Enumerator def each_second(&block) each_with_index do |_, idx| block.call # 最后一次迭代后无需休眠,避免多余等待 sleep(1) unless idx == size - 1 end end end
调用2.times.each_second { p 'works' }后,会先立刻打印一次'works',等待1秒后再打印第二次,完全符合需求。
方案二:兼容无size的枚举器
如果要让each_second支持更多类型的枚举器(有些枚举器没有size属性),可以先把枚举器转换为数组,再遍历处理:
class Enumerator def each_second(&block) elements = to_a elements.each_with_index do |val, idx| block.call(val) sleep(1) unless idx == elements.length - 1 end end end
这种方式把枚举器的所有元素提前加载到数组中,通过数组长度判断是否为最后一次迭代,适用性更广。
关键思路说明
你不需要刻意把参数"2"传入each_second方法——2.times返回的枚举器本身就包含了循环次数的信息:要么通过size直接获取,要么通过转换为数组后取长度。利用这些信息,我们就能精准控制每次迭代后的休眠逻辑,避免最后一次执行完还额外等待1秒。
内容的提问来源于stack exchange,提问作者user21082481
相关产品推荐
相关产品推荐

