Скажіть програмі Ruby почекати деяку кількість часу


418

Як сказати програмі Ruby чекати довільну кількість часу, перш ніж перейти до наступного рядка коду?

Відповіді:


675

Подобається це:

sleep(num_secs)

num_secsЗначення може бути цілим або з плаваючою крапкою.

Крім того, якщо ви пишете це в додатку Rails або ви включили бібліотеку ActiveSupport у свій проект, ви можете побудувати довші інтервали, використовуючи наступний синтаксис зручності:

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

122

Використовуйте сон так:

sleep 2

Це буде спати 2 секунди.

Будьте уважні, щоб дати аргументи. Якщо ви просто запустите sleep, процес спатиме вічно. (Це корисно, коли ви хочете, щоб нитка спала, поки вона не прокинеться.)


3
Почекайте, спати буде вічно, або поки його не "прокинуться"? Що навіть означає «прокинувся»?
Майкл Дорст

4
@anthropomorphic Це стосується того, коли інший потік викликає Thread # run.
Джошуа Пінтер

Насправді, коли інша нитка називає Thread # wakeup, я припускаю.
честербр

2

Я вважаю untilдуже корисним зі сном. приклад:

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

Це те саме, щоsleep(10.seconds)
danielricecodes

Так, тут це те саме, що він використовує той самий вхід (час), який пропонується сном. Я хотів висвітлити, як untilможна використовувати для сну, поки не буде досягнуто будь-якої умови (також люблю те, наскільки природно почувається синтаксис)
Варун Гарг,

1

sleep 6буде спати 6 секунд. Для більшої тривалості ви також можете використовувати sleep(6.minutes)або sleep(6.hours).


4
Не впевнений у суттєвих висновках щодо цього, але це може бути так, minutes()і hours()це методи з числових даних, додані Ruby on Rails - тому не стандартні в Ruby - в класі ActiveSupport :: Duration. Вони досить зручні, хоча.
Йохем Шуленклоппер

11
Я думаю, що першопричиною погіршення голосів є те, що @vijaya_chowdary в основному повернув правильну відповідь 8 років потому. Я б вважав, що це принаймні дивно ...
StahlRat

1
Я підтримав саме це. Це не стандартний рубін.
hayesk

1

Реалізація секунд / хвилин / годин, що є рейковими методами. Зауважте, що неявні повернення не потрібні, але вони виглядають чистішими, тому я віддаю перевагу їм. Я не впевнений, що у Rails навіть є .days або якщо він піде далі, але це ті, що мені потрібно.

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

Після цього можна зробити: sleep 5.secondsспати 5 секунд. Можна sleep 5.minutesспати протягом 5 хв. Можна sleep 5.hoursспати протягом 5 годин. І нарешті, ви можете sleep 5.daysспати протягом 5 днів ... Ви можете додати будь-який метод, який повертає значення self * (кількість секунд у цьому часовому інтервалі). Як вправу, спробуйте її виконувати місяцями!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.