В Ruby, как я могу сочетать сон с получением?Я хочу ждать ответа пользователя в течение 1 минуты, в противном случае продолжить - PullRequest
5 голосов
/ 03 июня 2011

Я выполняю цикл, в котором я жду ответа пользователя с помощью команды gets.chomp.Как я могу объединить это с командой сна / таймера?

Например.Я хочу, чтобы пользователь ожидал ввода слова в течение 1 минуты, в противном случае он вернется к циклу.

Ответы [ 3 ]

5 голосов
/ 03 июня 2011

Вы должны посмотреть на Руби Timeout.

Из документов:

require 'timeout'
status = Timeout::timeout(5) {
  # Something that should be interrupted if it takes too much time...
}
1 голос
/ 04 июня 2011

Я думаю, что метод Timeout, описанный выше, вероятно, самый элегантный способ решения этой проблемы Другое решение, доступное на большинстве языков, использует select. Вы передаете список файловых дескрипторов для мониторинга и необязательный таймаут. Код гораздо менее лаконичен:

ready_fds = select [ $stdin ], [], [], 10
puts ready_fds.first.first.gets unless ready_fds.nil?
0 голосов
/ 20 апреля 2017

Как насчет:

def gets_or_timeout(to)
 # Use thread and time limit to wait for a key or refresh after time if no key is hit.
 t=Thread.new{ print "\n> "; gets}
 t.join(to) #wait for end or number of seconds
 t.kill
end

...
gets_or_timeout(60)
...
...