Спать до тех пор, пока условие не будет истинным в рубине
Есть ли лучший способ в 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}