You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:25:17