如果没有第一次给出用户,如何重新询问用户输入?

时间:2013-10-05 06:05:05

标签: ruby

我目前的代码是:

print "Feed me input."
def get_input
    input_value=gets.chomp
    if !input_value
      print "you didn't type anything"
    else
      input_value.downcase!
      if input_value.include? "s"
         input_value.gsub!(/s/,"th")
      else 
         print "You entered a string but it had no 's' letters."
      end
    end
   return input_value
end
get_input()
if !get_input
  get_input
  else 
    puts "#{get_input}"
end

我不确定为什么它不起作用。当我运行它时,我会收到提示输入,然后当我输入任何一个后按Enter键时,我得到“你输入了一个字符串,但它没有''字母”,而不是“你没有输入任何东西”我想要的。

2 个答案:

答案 0 :(得分:3)

falsenil之外的所有对象如果用作谓词,则会被视为false。即使空字符串也被视为true

s = ""
puts true if s # => true

使用String#empty?检查它是否为空字符串。

答案 1 :(得分:2)

正如你所说当我运行它时,我会收到提示输入,然后当我输入无输入时按Enter键 - 这意味着实际发生的事情是

 input_value="\n".chomp #( you gets methods take only `\n` as input)
 "\n".chomp # => ""

所以你的input_value变量保持并且空字符串对象。 现在在Ruby中,每个对象都有true值,nilfalse除外。 表示""也是如此,但你做了!input_value,这意味着你明确地将它false。这就是下面if-else块中的原因, else 部分已被执行,而您没有看到预期输出“您没有输入任何内容”

if !input_value
      print "you didn't type anything"
    else
      input_value.downcase!
      if input_value.include? "s"
      #.. rest code.

因此我建议您在这样的上下文中将行if !input_value替换为if input_value.empty?,这将使您的代码按照您的预期行事。我没有把你的逻辑作为一个整体,但试图告诉你如何编码以满足你的需求:

print "Feed me input."
def get_input
    input_value=gets.chomp
    if input_value.empty?
      puts "you didn't type anything"
      false
    else
      puts "found value" 
      input_value.downcase!
    end
end

until input = get_input
   # code
end
puts input

<强>输出

kirti@kirti-Aspire-5733Z:~/Ruby$ ruby test.rb
Feed me input.
you didn't type anything

you didn't type anything

you didn't type anything
HH
found value
hh
kirti@kirti-Aspire-5733Z:~/Ruby$