我正在尝试编写一个简单的ruby函数,它可以提示用户输入值,如果用户自己按下ENTER,则使用默认值。 在下面的示例中,第一次调用Prompt函数可以通过按Enter键来处理,并使用默认值。但是,第二次我调用Prompt并按ENTER键时,没有任何反应,事实证明我必须在ENTER之前按下其他一些字符才能从'gets'调用返回。
必须有一些方法来刷新输入缓冲区以避免此问题。谁知道该怎么办?
谢谢,
def BlankString(aString)
return (aString == nil) ||
(aString.strip.length == 0)
end
#Display a message and accept the input
def Prompt(aMessage, defaultReponse = "")
found = false
result = ""
showDefault = BlankString(defaultReponse) ? "" : "(#{defaultReponse})"
while not found
puts "#{aMessage}#{showDefault}"
result = gets.chomp
result.strip!
found = result.length > 0
if !found
then if !BlankString(showDefault)
then
result = defaultReponse
found = true
end
end
end
return result
end
foo = Prompt("Prompt>", "sdfsdf")
puts foo
foo = Prompt("Prompt>", "default")
puts foo
答案 0 :(得分:1)
这在技术上不是一个答案,但无论如何它会帮助你:使用Highline(http://highline.rubyforge.org/),如果你正在制作一个命令行交互式界面,它会给你带来很多麻烦此
答案 1 :(得分:1)
我尝试了你的代码(在Windows下),它似乎工作正常。 您使用的操作系统是什么?
答案 2 :(得分:0)
我还尝试使用ruby 1.8.6的代码(在OSX下),它运行良好:
:! ruby prompt.rb
Prompt>(sdfsdf)
sdfsdf
Prompt>(default)
default
运行以下内容后会得到什么?
c = gets
b = gets
a = gets
p [ a, b, c ]
我只是点击'输入'3x并获得
["\n", "\n", "\n"]
我猜你错误的是你在你的while语句中输入了一个无限循环,而不是传递defaultResponse
(在某些代码中,你实际上已经运行了不在你的例子中)。 / p>
答案 3 :(得分:0)
我已经确认(通过在Komodo之外运行程序),问题实际上只发生在Komodo内部。我感谢大家的反馈,并花时间进行独立测试(我没有考虑过),以帮助缩小问题范围。