我有一个函数,可以强制用户输入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
答案 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")它们足以区分。甚至有一些高级功能,如倒带(当你启用此功能时,用户点击向上箭头重新访问问题)。