循环时无法处理其他阻塞

时间:2015-03-01 20:10:49

标签: ruby

我有一个函数,可以强制用户输入yes/no/y/n的值。如果用户输入任何其他值,那么它应该提示用户输入INVALID ENTRY消息,但它没有按预期处理else块。有人能告诉我这里出了什么问题吗?

def handleYesNo(value)
    begin
        val = ""

        while("#{value}" != "")
             if ("#{value.downcase}" == "yes" || "#{value.downcase}" == "y" || "#{value.downcase}" == "no" || "#{value.downcase}" == "n")
                    val = value
                    break
             else
                     puts "INVALID ENTRY"
             end
         end

         val

      rescue => e
           puts "Exception occurred - #{e}.".red
      end
end

4 个答案:

答案 0 :(得分:2)

如果将除yes / no / y / n之外的任何内容传递给此方法,它将永远循环。这是因为你在else块中没有break

也许您想再次提示用户?您可以从方法传递一个布尔值来指示它是否成功。然后你可以照顾它是调用代码。此范围内对循环的需求也消失了。

Sidenote :您可以将if条件重写为:

['y','n','yes','no'].include? value.downcase

答案 1 :(得分:1)

answer = "" # the empty string

while answer != "yes" and answer != "y" and answer != "no" and answer != "n" do
  answer = gets.chomp
  if answer != "yes" and answer != "y" and answer != "no" and answer != "n" 
    puts "INVALID ENTRY"
  end
end

答案 2 :(得分:1)

看起来问题是永远不会提示用户输入新的value。这意味着如果传入的value参数是好的,它将会中断,否则将永远循环,因为value不会为空(while循环条件)并且它将永远不要重置你正在寻找的东西。我推荐这样的事情:

def handleYesNo(value)
  val = ""

  while("#{value}" != "")
    if ['yes', 'y', 'no', 'n'].include?(value.downcase)
      val = value
    else
      puts "INVALID ENTRY, Enter new value: "
      value = gets.chomp
    end
  end

  val
end

答案 3 :(得分:1)

为了多样化,这是另一种选择。有一个名为interact的宝石,可以为你提供命令行提示。

class MyCommandLine
  include Interactive

  def run
    ask "Is this cool?", choices: ["yes", "no"]
  end
end

然后当您将其作为MyCommandLine.new.run运行时,它会提示您,根据需要重复提问,并自动接受简短的答案(例如" y"或" n")它们足以区分。甚至有一些高级功能,如倒带(当你启用此功能时,用户点击向上箭头重新访问问题)。