Beri tahu Program Ruby untuk Menunggu sejumlah waktu

418

Bagaimana Anda memberi tahu program Ruby untuk menunggu dalam jumlah waktu yang sewenang-wenang sebelum pindah ke baris kode berikutnya?

pengguna94154
sumber

Jawaban:

675

Seperti ini:

sleep(num_secs)

The num_secsnilai dapat integer atau float.

Juga, jika Anda menulis ini di dalam aplikasi Rails, atau telah memasukkan pustaka ActiveSupport dalam proyek Anda, Anda dapat membuat interval yang lebih lama menggunakan sintaksis kenyamanan berikut:

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

Gunakan tidur seperti ini:

sleep 2

Itu akan tidur selama 2 detik.

Hati-hati memberi argumen. Jika Anda hanya menjalankan sleep, proses akan tidur selamanya. (Ini berguna ketika Anda ingin utas tidur sampai terbangun.)

Clinton N. Dreisbach
sumber
3
Tunggu, apakah akan tidur selamanya, atau sampai "terbangun"? Apa artinya "terbangun"?
Michael Dorst
4
@anthropomorphic Ini merujuk pada saat utas lain memanggil Utas # jalankan.
Joshua Pinter
Sebenarnya, ketika utas lain memanggil utas # bangun, saya kira.
chesterbr
2

Saya merasa untilsangat berguna dengan tidur. contoh:

> time = Time.now
> sleep 2.seconds until Time.now > time + 10.seconds # breaks when true
Varun Garg
sumber
Ini adalah hal yang sama dengansleep(10.seconds)
danielricecodes
Ya, ini dia sama karena menggunakan input (waktu) yang sama seperti yang ditawarkan oleh sleep. Saya ingin menyoroti bagaimana untilbisa digunakan untuk tidur sampai kondisi apa pun tercapai (juga suka betapa alami rasanya sintaksis)
Varun Garg
1

sleep 6akan tidur selama 6 detik. Untuk durasi yang lebih lama, Anda juga dapat menggunakan sleep(6.minutes)atau sleep(6.hours).

vijaya chowdary
sumber
4
Tidak yakin tentang downvotes ini, tetapi bisa jadi itu minutes()dan hours()merupakan metode angka yang ditambahkan oleh Ruby on Rails - jadi bukan standar yang tersedia di Ruby - di kelas ActiveSupport :: Duration. Mereka cukup nyaman.
Jochem Schulenklopper
11
Saya pikir alasan utama untuk downvotes adalah bahwa @vijaya_chowdary pada dasarnya memposting ulang jawaban yang benar 8 tahun kemudian. Saya akan menganggap itu aneh setidaknya ...
StahlRat
1
Saya downvoted untuk itu. Itu bukan ruby ​​standar.
hayesk
1

Implementasi detik / menit / jam, yang merupakan metode rel. Perhatikan bahwa pengembalian implisit tidak diperlukan, tetapi mereka terlihat lebih bersih, jadi saya lebih suka mereka. Saya tidak yakin Rails bahkan memiliki .days atau jika berjalan lebih jauh, tetapi ini adalah yang saya butuhkan.

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

Setelah ini, Anda bisa melakukan: sleep 5.secondstidur selama 5 detik. Anda bisa sleep 5.minutestidur selama 5 menit. Anda bisa melakukannya sleep 5.hoursselama 5 jam. Dan akhirnya, Anda dapat melakukannya sleep 5.daysselama 5 hari ... Anda dapat menambahkan metode apa pun yang mengembalikan nilai diri * (jumlah detik dalam jangka waktu itu). Sebagai latihan, cobalah menerapkannya selama berbulan-bulan!

GSB
sumber