it-swarm-ru.tech

спать, пока условие не станет истинным в ruby

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

loop do 
  sleep(1)
  if ready_to_go
    break
  end
end
15
ccy

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

23
the Tin Man

Вы можете использовать гем 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
Mikhail at YugaByte
def sleep_until(time)
  time.times do
    break if block_given? && yield
    sleep(1)
  end
end

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

sleep_until(18){till_i_die}
0
Jonas