循环直到答案是一个字符串

时间:2018-04-23 22:12:46

标签: ruby loops

我正在尝试循环此问题,直到用户输入为字符串值:

  

问题:你叫什么名字?

     
      
  • 我不希望用户只按Enter键并将名称留空。
  •   
  • 我不希望用户的输入为数字/数字。
  •   

请参阅下面的代码:

name1 = gets.chomp.to_s    
loop do
  print "Please enter your name "
  name1 = gets.chomp.to_s
  if name1.empty?
    puts "No input."
  else name1.to_i
    puts "Illegal character ':'"
  end
end

使用此代码,即使输入字符串值,也无法继续处理下一个问题。请帮忙。

2 个答案:

答案 0 :(得分:2)

您的代码有几个问题:

  1. 您的输入和输出无序。您在提示之前收集输入,并且从未使用过输入(从第一行开始):

    name1 = gets.chomp.to_s           # <- Ruby is waiting for input
    loop do
      print "Please enter your name " # <- user is prompted to enter name
      name1 = gets.chomp.to_s         # <- previous input is overwritten
      # ...
    end
    

    第一行应该删除。

  2. gets可能会返回nil,但chomp 始终会返回一个字符串。因此,之后调用to_s是多余的。

  3. 您的if-else构造实际上是:

    if name1.empty?
      puts "No input."
    else
      name1.to_i
      puts "Illegal character ':'"
    end
    

    因此,只要输入不是empty?,就会将其转换为整数(丢弃结果)并打印错误消息。您可能需要elsif代替/.../regexp\d匹配数字):

    if name1.empty?
      puts 'No input.'
    elsif name1.match? /\d/
      puts 'Digits not allowed.'
    end
    

    您还可以使用case expression

    case name1
    when ''
      puts 'No input.'
    when /\d/
      puts 'Digits not allowed.'
    end
    
  4. 您永远不会突破loop。即使没有发现错误,代码也会保持循环。这可以通过在else分支(ifcase)中添加break statement来解决:

      # ...
    else
      break
    end
    

答案 1 :(得分:-1)

gets.chomp将始终返回一个字符串,因此无需在方法上调用to_s

如果您不希望用户能够输入任何整数,您可以使用以下内容获得清洁解决方案:

name.count("0-9") > 0

如果这返回true,那么您知道用户的输入包含至少一个数字。