在用户输入正确的信息之前,如何循环用户输入请求?

时间:2013-12-04 22:11:28

标签: ruby loops if-statement user-input

我是一名正在尝试学习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 个答案:

答案 0 :(得分:7)

你是正确的,你需要循环运行你的代码。使用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

答案 1 :(得分:1)

    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

您可以尝试这样做以使代码清洁。

答案 2 :(得分:1)

尝试使用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

答案 3 :(得分:0)

虽然这个问题的标题有些不相关,但请看这里使用的技巧:Ruby Retry and ensure block is not working

使用Ruby中可用的错误检测和唯一retry关键字,您可以轻松地执行重试循环,并且具有良好的错误处理能力。

但是,请注意我指出的例子并不是最好的。有一些小问题。例如,你不应该抓住Exception,相当简单的rescue => e就足够了。但总的想法应该是相当明确的。