Powiedz programowi Ruby, aby zaczekał przez pewien czas

418

Jak powiedzieć programowi Ruby, aby odczuwał dowolną ilość czasu przed przejściem do następnego wiersza kodu?

użytkownik94154
źródło

Odpowiedzi:

675

Lubię to:

sleep(num_secs)

num_secsWartość może być liczbą całkowitą lub pływaka.

Ponadto, jeśli piszesz to w aplikacji Rails lub włączyłeś bibliotekę ActiveSupport do swojego projektu, możesz konstruować dłuższe interwały, używając następującej wygodnej składni:

sleep(4.minutes)
# or, even longer...
sleep(2.hours); sleep(3.days) # etc., etc.
# or shorter
sleep(0.5) # half a second
rcoder
źródło
122

Użyj snu w taki sposób:

sleep 2

To będzie spało przez 2 sekundy.

Uważaj, aby podać argument. Jeśli po prostu uruchomisz sleep, proces będzie spał na zawsze. (Jest to przydatne, gdy chcesz, aby wątek spał do momentu jego przebudzenia).

Clinton N. Dreisbach
źródło
3
Poczekaj, czy będzie spał wiecznie, czy też „obudzi się”? Co w ogóle oznacza „obudzony”?
Michael Dorst,
4
@anthropomorphic Odnosi się do sytuacji, gdy inny wątek wywołuje Thread # run.
Joshua Pinter,
Właściwie, kiedy inny wątek wywołuje Wakeup wątku #, przypuszczam.
chesterbr
2

Uważam, że untilbardzo przydatny jest sen. przykład:

> time = Time.now
> sleep 2.seconds until Time.now > time + 10.seconds # breaks when true
Varun Garg
źródło
Jest to to samo, cosleep(10.seconds)
danielricecodes
Tak, tutaj jest tak samo, ponieważ wykorzystuje to samo wejście (czas), jakie oferuje sen. Chciałem podkreślić, jak untilmożna spać, dopóki nie zostanie spełniony jakikolwiek warunek (uwielbiam także naturalną składnię)
Varun Garg
1

sleep 6będzie spał przez 6 sekund. Przez dłuższy czas możesz także użyć sleep(6.minutes)lub sleep(6.hours).

vijaya chowdary
źródło
4
Nie jestem pewien co do negatywnych opinii na ten temat, ale może tak być minutes()i hours()są to metody liczbowe dodane przez Ruby on Rails - więc nie są standardowo dostępne w Ruby - w klasie ActiveSupport :: Duration. Są jednak dość wygodne.
Jochem Schulenklopper,
11
Myślę, że głównym powodem negatywnych opinii jest to, że @vijaya_chowdary w zasadzie opublikował poprawną odpowiedź 8 lat później. Uważam, że to co najmniej dziwne ...
StahlRat
1
Właśnie głosowałem za tym. To nie jest standardowy rubin.
hayesk
1

Realizacja sekund / minut / godzin, które są metodami szynowymi. Pamiętaj, że niejawne zwroty nie są potrzebne, ale wyglądają na czystsze, więc wolę je. Nie jestem pewien, czy Railsy mają nawet .dni lub jeśli idzie dalej, ale to są te, których potrzebuję.

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

Następnie możesz: sleep 5.secondsspać przez 5 sekund. Możesz sleep 5.minutesspać przez 5 minut. Możesz sleep 5.hoursspać przez 5 godzin. I na koniec możesz sleep 5.daysspać przez 5 dni ... Możesz dodać dowolną metodę, która zwraca wartość self * (ilość sekund w tym przedziale czasowym). Jako ćwiczenie spróbuj wdrożyć je przez miesiące!

gsb
źródło