451 votes

Dites au programme Ruby d'attendre un certain temps.

Comment dire à un programme Ruby d'attendre un temps arbitraire avant de passer à la ligne de code suivante ?

736voto

rcoder Points 4517

Comme ça :

sleep(num_secs)

Le site num_secs La valeur peut être un entier ou un flottant.

De plus, si vous écrivez ceci dans une application Rails, ou si vous avez inclus la bibliothèque ActiveSupport dans votre projet, vous pouvez construire des intervalles plus longs en utilisant la syntaxe suivante :

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

133voto

Clinton R. Nixon Points 4283

Utilisez dormir comme ça :

sleep 2

Ça va dormir pendant 2 secondes.

Faites attention à donner un argument. Si vous ne faites que courir sleep le processus sera mis en sommeil pour toujours. (C'est utile lorsque vous voulez qu'un thread dorme jusqu'à ce qu'il soit réveillé).

3 votes

Attends, il va dormir pour toujours, ou jusqu'à ce qu'il soit "réveillé" ? Qu'est-ce que ça veut dire "réveillé" ?

4 votes

@anthropomorphic Il s'agit du cas où un autre thread appelle Thread#run.

0 votes

En fait, quand un autre fil appelle Thread#wakeup, je suppose.

7voto

Varun Garg Points 1103

Je trouve until très utile avec le sommeil. exemple :

> time = Time.now
> sleep 2.seconds until Time.now > time + 10.seconds # breaks when true
> # or
> sleep 2 and puts 'still sleeping' until Time.now > time + 10
> # or
> sleep 1.seconds until !req.loading # suggested by ohsully

1 votes

C'est la même chose que sleep(10.seconds)

0 votes

Oui, ici c'est la même chose parce qu'il utilise la même entrée (heure) que celle proposée par sleep. Je voulais souligner comment until peut être utilisé pour dormir jusqu'à ce que n'importe quelle condition soit remplie (j'aime aussi la sensation naturelle de la syntaxe)

0 votes

Cela me fait mal à la tête. Pouvez-vous fournir un exemple différent de celui-ci pour montrer la valeur de l'utilisation de until au lieu de simplement sleep(10.seconds) ?

2voto

gsb Points 21

Implémentation des secondes/minutes/heures, qui sont des méthodes de rails. Notez que les retours implicites ne sont pas nécessaires, mais ils sont plus propres, donc je les préfère. Je ne suis pas sûr que Rails dispose de .days ou qu'il aille plus loin, mais ce sont les méthodes dont j'ai besoin.

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

Après cela, vous pouvez le faire : sleep 5.seconds pour dormir pendant 5 secondes. Vous pouvez faire sleep 5.minutes pour dormir pendant 5 minutes. Vous pouvez faire sleep 5.hours pour dormir pendant 5 heures. Et enfin, vous pouvez faire sleep 5.days pour dormir pendant 5 jours... Vous pouvez ajouter n'importe quelle méthode qui renvoie la valeur de self * (nombre de secondes dans ce laps de temps). Comme exercice, essayez de l'implémenter pendant des mois !

1voto

vijaya chowdary Points 51

sleep 6 s'endormira pendant 6 secondes. Pour une durée plus longue, vous pouvez également utiliser sleep(6.minutes) ou sleep(6.hours) .

4 votes

Je ne suis pas sûr des votes négatifs sur cette question, mais il se pourrait que ce soit le cas. minutes() y hours() sont des méthodes numériques ajoutées par Ruby on Rails - donc non disponibles en Ruby - dans la classe ActiveSupport::Duration. Elles sont cependant très pratiques.

13 votes

Je pense que la raison principale des downvotes est que @vijaya_chowdary a reposté la réponse correcte votée 8 ans plus tard. Je considère que c'est pour le moins étrange...

1 votes

J'ai rétrogradé pour cela. Ce n'est pas du ruby standard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X