Спать до тех пор, пока условие не будет истинным в рубине

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

loop do 
  sleep(1)
  if ready_to_go
    break
  end
end

Ответы

Ответ 1

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

Ответ 2

Вы можете использовать драгоценный камень 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

Ответ 3

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

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

sleep_until(18){till_i_die}