例如,如果我想制作一个计时器,在循环中如何延迟以使其按秒计数而不仅仅是在毫秒级别上循环?
在你提出非常简单的直接问题后,上面的“评论”就是你的答案:
1.upto(5) do |n|
puts n
sleep 1 # second
end
如果你想要定期运行一个方法,而不阻塞代码的其余部分,那么你需要使用线程(并可能创建互斥锁来确保两个代码片段不会同时修改同一个数据结构):
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
ArgumentError: time interval must not be negative
。 - Fatima
sleep 1
命令来让程序休眠一秒钟。http://www.ruby-doc.org/core-2.2.0/Kernel.html#method-i-sleep - Michael Berkowskidef/end
包裹起来,形成一个函数def counter(n)
,并将5
替换为n
。 - Michael Berkowski