Как выполнить цикл запроса ввода пользователя, пока пользователь не введет правильную информацию?

Я новичок, который пытается узнать Ruby. До сих пор я изучал кое-что из более простых вещей, но, похоже, я застрял в попытке объединить пару вещей, которые я узнал.

то, что я пытаюсь сделать, это задать пользователю вопрос и сказать им, чтобы ввести 1 или 2. Простой оператор if позволит мне ответить одним вариантом, если они вводят 1, и другим вариантом, если они вводят 2. Однако, если они вводят что-то совершенно другое, например другое число, строку и т. д., как я могу предложить им попробовать еще раз и вернуться к исходному вопросу?

что мне до сих пор выглядит примерно так.

prompt = "> " 
puts "Question asking for 1 or 2." 
print prompt
user_input = gets.chomp.to_i

if user_input == 1    
   puts "One response." 
elsif user_input == 2   
   puts "Second response." 
else    
   puts "Please enter a 1 or a 2." 
end

вот где я застрял. Как мне заставить его вернуться на "вопросы для 1 или 2."пока пользователь не введет 1 или 2? Я знаю, что это, вероятно, какой-то цикл, но я не могу понять, какой вид использовать и как включить запрос ввода пользователя повторно (при необходимости) до получения желаемого ввода. Любая помощь буду очень признателен. Спасибо.

4 ответов


вы правы, что вам нужно запустить свой код в цикле. С помощью while петли с gets.chomp в качестве условия вы можете продолжать запрашивать пользовательский ввод, пока не решите, что у вас есть то, что вы хотите.

в этом случае, вы хотите проверить ответ на вопрос и переспрашивать, если он неверный. Вам не нужно много менять, кроме как убедиться, что вы выходите из цикла, когда ответ правильный. Если ответ неверен, распечатайте приглашение еще раз.

это слегка переделанный вариант, который использует case вместо этого, но это показывает, что вам нужно сделать. Несомненно, есть более чистый способ сделать это...

prompt = "> "
puts "Question asking for 1 or 2."
print prompt

while user_input = gets.chomp # loop while getting user input
  case user_input
  when "1"
    puts "First response"
    break # make sure to break so you don't ask again
  when "2"
    puts "Second response"
    break # and again
  else
    puts "Please select either 1 or 2"
    print prompt # print the prompt, so the user knows to re-enter input
  end
end

    user_input = 0
    until [1,2].include? user_input do
        puts "Please enter a 1 or a 2.>" 
        user_input = gets.chomp.to_i
    end
    if user_input == 1    
        puts "One response." 
    else   
        puts "Second response." 
    end

вы можете попробовать это, чтобы сделать ваш код чистым.


попробуйте использовать until способ такой:

prompt = "> " 
print prompt

user_input = nil
until (user_input == 1 or user_input == 2)
    puts "Please enter a 1 or 2." 
    user_input = gets.chomp.to_i
end



if user_input == 1    
   puts "One response." 
elsif user_input == 2   
   puts "Second response." 
else    
   puts "Please enter a 1 or a 2." 
end

хотя название этого вопроса несколько не связано, см. трюк, который используется здесь:Ruby повторите попытку и убедитесь, что блок не работает

использование обнаружения ошибок и уникальные retry ключевое слово, доступное в Ruby, позволяет легко выполнить цикл повтора, уплотненный вместе с хорошей обработкой ошибок.

однако имейте в виду, что пример, на который я указал, не самый лучший. Есть некоторые незначительные проблемы. Например, вы не должны поймать Exception, довольно простой rescue => e будет достаточно. Но общая идея должна быть достаточно четкой.