Diga ao programa Ruby para esperar algum tempo

418

Como você diz a um programa Ruby para esperar uma quantidade arbitrária de tempo antes de passar para a próxima linha de código?

user94154
fonte

Respostas:

675

Como isso:

sleep(num_secs)

O num_secsvalor pode ser um número inteiro ou flutuante.

Além disso, se você estiver escrevendo isso em um aplicativo Rails ou tiver incluído a biblioteca ActiveSupport em seu projeto, poderá construir intervalos mais longos usando a seguinte sintaxe de conveniência:

sleep(4.minutes)
# or, even longer...
sleep(2.hours); sleep(3.days) # etc., etc.
# or shorter
sleep(0.5) # half a second
rcoder
fonte
122

Use o sono da seguinte maneira:

sleep 2

Isso vai dormir por 2 segundos.

Tenha cuidado para argumentar. Se você apenas executar sleep, o processo será suspenso para sempre. (Isso é útil quando você deseja que um thread durma até que seja despertado.)

Clinton N. Dreisbach
fonte
3
Espere, ele vai dormir para sempre ou até que seja "acordado"? O que significa "acordado"?
Michael Dorst
4
@anthropomorphic Refere-se a quando outro thread chama Thread # run.
Joshua Pinter
Na verdade, quando outro encadeamento chama Thread # wakeup, suponho.
Chesterbr #
2

Eu acho untilmuito útil dormir. exemplo:

> time = Time.now
> sleep 2.seconds until Time.now > time + 10.seconds # breaks when true
Varun Garg
fonte
Isso é a mesma coisa quesleep(10.seconds)
danielricecodes
Sim, aqui é a mesma coisa porque usa a mesma entrada (hora) oferecida pelo sono. Eu queria destacar como untilpode ser usado para dormir até que qualquer condição seja alcançada (também adoro a naturalidade da sintaxe)
Varun Garg
1

sleep 6dormirá por 6 segundos. Por um longo período, você também pode usar sleep(6.minutes)ou sleep(6.hours).

vijaya chowdary
fonte
4
Não tenho certeza sobre as votações negativas sobre isso, mas pode ser isso minutes()e hours()os métodos numéricos adicionados pelo Ruby on Rails - portanto, não estão disponíveis no Ruby - na classe ActiveSupport :: Duration. Eles são bastante convenientes.
Jochem Schulenklopper
11
Eu acho que a principal razão para votos negativos é que @vijaya_chowdary basicamente republicou a resposta correta votada 8 anos depois. Eu consideraria isso é estranho, pelo menos ...
StahlRat
1
Eu votei para exatamente isso. Não é rubi padrão.
hayesk
1

Implementação de segundos / minutos / horas, que são métodos rails. Observe que retornos implícitos não são necessários, mas eles parecem mais limpos, então eu os prefiro. Não tenho certeza se o Rails ainda tem dias. Ou se vai mais longe, mas esses são os que eu preciso.

class Integer
   def seconds
      return self
   end
   def minutes
      return self * 60
   end
   def hours
      return self * 3600
   end
   def days
      return self * 86400
   end
end

Depois disso, você pode fazer: sleep 5.secondsdormir por 5 segundos. Você pode fazer sleep 5.minutespara dormir por 5 min. Você pode fazer sleep 5.hourspara dormir por 5 horas. E, finalmente, você pode sleep 5.daysdormir cinco dias ... Você pode adicionar qualquer método que retorne o valor de si * (quantidade de segundos nesse período de tempo). Como exercício, tente implementá-lo por meses!

gsb
fonte