Di 'al programma Ruby di attendere un po' di tempo


418

Come si dice a un programma Ruby di attendere un tempo arbitrario prima di passare alla riga di codice successiva?

Risposte:


675

Come questo:

sleep(num_secs)

Il num_secsvalore può essere un numero intero o float.

Inoltre, se stai scrivendo questo all'interno di un'app Rails o hai incluso la libreria ActiveSupport nel tuo progetto, puoi costruire intervalli più lunghi usando la seguente sintassi di convenienza:

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

122

Usa il sonno in questo modo:

sleep 2

Dormirà per 2 secondi.

Fai attenzione a dare una discussione. Se esegui semplicemente sleep, il processo rimarrà inattivo per sempre. (Questo è utile quando vuoi che un thread dorma fino a quando non viene svegliato.)


3
Aspetta, dormirà per sempre o fino a quando non sarà "svegliato"? Cosa significa "svegliato"?
Michael Dorst,

4
@anthropomorphic Si riferisce a quando un altro thread chiama Thread # run.
Joshua Pinter,

In realtà, quando un altro thread chiama Thread # wakeup, suppongo.
Chester

2

Trovo untilmolto utile con il sonno. esempio:

> time = Time.now
> sleep 2.seconds until Time.now > time + 10.seconds # breaks when true

Questa è la stessa cosa disleep(10.seconds)
danielricecodes

Sì, qui è lo stesso perché utilizza lo stesso input (tempo) offerto da sleep. Volevo evidenziare come untilpuò essere utilizzato per dormire fino a quando non viene raggiunta una condizione (adoro anche la sensazione naturale della sintassi)
Varun Garg

1

sleep 6dormirà per 6 secondi. Per una durata più lunga, puoi anche usare sleep(6.minutes)o sleep(6.hours).


4
Non sono sicuro dei downvotes su questo, ma potrebbe essere quello minutes()e hours()sono i metodi numerici aggiunti da Ruby on Rails - quindi non standard disponibile in Ruby - nella classe ActiveSupport :: Duration. Sono abbastanza convenienti però.
Jochem Schulenklopper,

11
Penso che il motivo principale dei downvotes sia che @vijaya_chowdary ha ripubblicato la risposta corretta votata 8 anni dopo. Considererei almeno strano ...
StahlRat,

1
Ho effettuato il downgrade per questo. Non è un rubino standard.
Hayesk,

1

Implementazione di secondi / minuti / ore, che sono metodi di rotaie. Nota che i rendimenti impliciti non sono necessari, ma sembrano più puliti, quindi li preferisco. Non sono sicuro che Rails abbia anche .days o se va oltre, ma questi sono quelli di cui ho bisogno.

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

Dopo questo, puoi fare: sleep 5.secondsdormire per 5 secondi. Puoi sleep 5.minutesdormire per 5 minuti. Puoi sleep 5.hoursdormire per 5 ore. E infine, puoi sleep 5.daysdormire per 5 giorni ... Puoi aggiungere qualsiasi metodo che restituisca il valore di sé * (quantità di secondi in quel lasso di tempo). Come esercizio, prova ad implementarlo per mesi!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.