2011-02-12 23 views
15

¿Hay alguna manera mejor en Ruby para dormir hasta que alguna condición sea cierta?duerme hasta que la condición sea verdadera en ruby ​​

loop do 
    sleep(1) 
    if ready_to_go 
    break 
    end 
end 
+0

por lo general, esa es la forma común de hacerlo. o puede usar el programador de tareas como cron etc. – kurumi

+2

¿Qué hay de malo en este enfoque? ¿Le preocupa que sea el equivalente a preguntar constantemente "¿Ya llegamos?", O ¿le preocupa que sea detallado? –

Respuesta

22

until puede ser un modificador de la declaración, que conduce a:

sleep(1) until ready_to_go 

Vas a tener que utilizar que en un hilo con otro hilo cambiar ready_to_go lo contrario va a colgar.

while (!ready_to_go) 
    sleep(1) 
end 

es similar a pero, de nuevo, necesitas hacer algo para cambiar ready_to_go o si debe colgar.

que puede usar:

until (ready_to_go) 
    sleep(1) 
end 

pero nunca he sentido cómodo usando until así. En realidad, casi nunca lo uso, prefiero el equivalente (!ready_to_go).

+0

Estaba usando erróneamente "sleep until ready_to_go". Gracias. – ccy

+2

Simplemente debes tener cuidado con las condiciones que nunca pueden dar como resultado una declaración verdadera o terminarás en un agujero negro. Aprendí esa lección cuando estaba escribiendo el lenguaje ensamblador y C, y encerré mi máquina tan mal que tuve que tirar del cable de alimentación para que volviera a mi control. Varias veces. Suspiro. :-) –

+0

¿Querías decir 'menos' o' hasta '? (Ambos son negativos, y ambos comienzan con "un") –

2

Puede usar la gema waitutil como se describe en http://rubytools.github.io/waitutil/, p. Ej.

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
def sleep_until(time) 
    time.times do 
    break if block_given? && yield 
    sleep(1) 
    end 
end 

Uso:

sleep_until(18){till_i_die} 
Cuestiones relacionadas