2

ユーザーに値の入力を求めることができる単純なルビ関数を作成しようとしています。ユーザーが単独で ENTER を押すと、デフォルト値が使用されます。次の例では、Prompt 関数の最初の呼び出しは、Enter キーを押すだけで処理でき、既定値が使用されます。しかし、2 回目に Prompt を呼び出して ENTER を押しても何も起こらず、'gets' 呼び出しから戻るには 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で)試しましたが、うまくいくようでした。どのOSを使用していますか?

于 2008-12-02T01:33:56.040 に答える
0

私は(コモドの外でプログラムを実行することによって)問題が実際にはコモドの中でのみ起こっていることを確認しました。問題を絞り込むために、フィードバックと独立したテスト(私はまだしていませんでした)を行うために時間を割いてくれたすべての人に感謝します。

于 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」を 3 回押して取得するだけです

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

間違っているのは、 while ステートメントに渡さないことで無限ループに入っていることだdefaultResponseと思います(実際に実行しているコードでは、例にはありません)。

于 2008-12-02T03:08:40.903 に答える