睡觉直到红宝石中的情况属实

时间:2011-02-12 01:38:37

标签: ruby

在某些条件成立之前,Ruby有没有更好的方法可以睡觉?

loop do 
  sleep(1)
  if ready_to_go
    break
  end
end

4 个答案:

答案 0 :(得分:23)

until可以是一个语句修饰符,导致:

sleep(1) until ready_to_go

你必须在另一个线程改变ready_to_go的线程中使用它,否则你会挂起。

while (!ready_to_go)
  sleep(1)
end

与此相似,但同样,您需要切换ready_to_go或者您要挂起。

您可以使用:

until (ready_to_go)
  sleep(1)
end

但是我从来没有像这样使用until。实际上我几乎从不使用它,更喜欢等效的(!ready_to_go)

答案 1 :(得分:3)

您可以使用http://rubytools.github.io/waitutil/中描述的waitutil gem,例如

require 'waitutil'

WaitUtil.wait_for_condition("my_event to happen", 
                            :timeout_sec => 30,
                            :delay_sec => 0.5) do
  check_if_my_event_happened
end

答案 2 :(得分:0)

def sleep_until(time)
  time.times do
    break if block_given? && yield
    sleep(1)
  end
end

用法:

sleep_until(18){till_i_die}

答案 3 :(得分:0)

我喜欢这种形式,因为它很简单,并且在测试完成条件后仅在需要时使用睡眠:

begin
  ready_to_go = do_some_action
end until ready_to_go or not sleep 1