如何在Ruby中循环延迟?

例如,如果我想制作一个计时器,我如何在循环中进行延迟,以便以秒为单位计算,而不是仅仅在几毫秒内完成循环?

鉴于您提出的非常简单的直接问题,上面的“评论”是您的答案:

 1.upto(5) do |n| puts n sleep 1 # second end 

您可能希望定期运行方法,而不会阻止其余代码。 在这种情况下,您希望使用一个Thread(并且可能创建一个互斥锁以确保两段代码不会同时尝试修改相同的数据结构):

 require 'thread' items = [] one_at_a_time = Mutex.new # Show the values every 5 seconds Thread.new do loop do one_at_a_time.synchronize do puts "Items are now: #{items.inspect}" sleep 5 end end end 1000.times do one_at_a_time.synchronize do new_items = fetch_items_from_web a.concat( new_items ) end end 

不知何故,许多人认为将具有恒定时间间隔的sleep方法作为其参数将起作用。 但请注意,没有方法需要零时间。 如果将sleep(1)置于循环中,只要循环中有其他内容,循环肯定会超过1秒。 更糟糕的是,处理循环的每次迭代并不总是花费相同的时间。 每个周期将花费超过1秒,错误是随机的。 随着循环继续运行,此错误将污染并始终向正增长。 特别是如果你想要一个计时器,周期很重要,你不想这样做。

使用常量指定时间间隔循环的正确方法是这样做:

 loop do t = Time.now #... content of the loop sleep(t + 1 - Time.now) end