2

我正在尝试编写一个简单的 ruby​​ 函数,它可以提示用户输入一个值,如果用户自己按 ENTER,则使用默认值。在下面的示例中,可以通过单独按 ENTER 来处理对 Prompt 函数的第一次调用,并将使用默认值。但是,我第二次调用 Prompt 并按 ENTER 时,什么也没有发生,事实证明我必须在 ENTER 之前按其他字符才能从“获取”调用返回。

必须有某种方法来刷新输入缓冲区以避免这个问题。有谁知道该怎么做?

谢谢,

大卫

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
4

4 回答 4

1

从技术上讲,这不是一个答案,但无论如何它都会对您有所帮助:使用 Highline ( http://highline.rubyforge.org/ ),如果您要进行命令行交互,它将为您省去很多麻烦像这样的界面

于 2008-12-02T01:14:31.307 回答
1

我试过你的代码(在 Windows 下),它似乎工作正常。您使用的是什么操作系统?

于 2008-12-02T01:33:56.040 回答
0

我已经确认(通过在 Komodo 之外运行程序)该问题实际上仅发生在 Komodo 内部。我感谢大家的反馈并花时间进行独立测试(我没有想过)以帮助缩小问题范围。

于 2008-12-02T14:10:25.390 回答
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 ]

我只是按 'Enter' 3x 并得到

["\n", "\n", "\n"]

我猜有什么问题是你在你的while语句中进入了一个无限循环,而不是传递它a defaultResponse(在一些你实际上正在运行的代码中,这不在你的例子中)。

于 2008-12-02T03:08:40.903 回答