спать до тех пор, пока условие не станет истинным в рубине - PullRequest
16 голосов
/ 12 февраля 2011

Есть ли лучший способ спать в Ruby, пока не выполнится какое-то условие?

loop do 
  sleep(1)
  if ready_to_go
    break
  end
end

Ответы [ 4 ]

25 голосов
/ 12 февраля 2011

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).

3 голосов
/ 18 февраля 2014

Вы можете использовать камень waitutil, как описано в http://rubytools.github.io/waitutil/, например,

require 'waitutil'

WaitUtil.wait_for_condition("my_event to happen", 
                            :timeout_sec => 30,
                            :delay_sec => 0.5) do
  check_if_my_event_happened
end
0 голосов
/ 04 апреля 2019

Мне нравится эта форма, так как она проста и использует режим сна только при необходимости, после того, как она проверит состояние готовности:

begin
  ready_to_go = do_some_action
end until ready_to_go or not sleep 1
0 голосов
/ 24 декабря 2014
def sleep_until(time)
  time.times do
    break if block_given? && yield
    sleep(1)
  end
end

Использование:

sleep_until(18){till_i_die}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...