1

以下の変数maxをハードコーディングすると、プログラムは問題なく実行されます。引数を渡すと、max は正しく設定されますが、スローとエラーが発生します。何故ですか?

max = ARGV[0].to_i

# Ask user for first guess
puts "I am thinking of a number between 1 and " + max.to_s + "."
print "Make your guess: "
guess = gets.chomp.to_i

スローされるエラー: `gets': そのようなファイルまたはディレクトリはありません (Errno:: ENOENT)

注: getsSTDIN.getsに変更することでエラーは修正されますが、引数がなくてもプログラムが正常に動作するのに、なぜこれが必要なのですか?

さらに、gets のデフォルトの動作をファイル全体でSTDIN.getsに戻す方法はありますか? おそらく、プログラムの先頭に1行ありますか?

4

2 に答える 2

2

Kernel.getsあなたの問題を説明するいくつかの興味深い動作があります:

http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-gets

ARGV具体的には が空か空でないかで動作が異なり、空でない場合は とは動作が異なりSTDIN.getsます。STDIN.gets明示的に使用したくない場合は、max = ARGV.shiftを呼び出す前にその要素を削除するために使用できますgets

最後の質問への対処: gets' の動作を強制的に一致させる最善の方法STDIN.getsは、おそらく、ARGV何か他のことを行う前に ' が空であることを確認し、それがそのままであることを確認することです。STDIN.getsただし、単に「念のために」を使用し続ける方が賢明な場合があります。このような異常で驚くべき動作が可能である場合、ほとんどの場合、できるだけ明示的にコードを記述することが最善です。

于 2013-02-12T00:07:48.237 に答える
0

以下を使用する必要があります。

STDIN.gets

ユーザー入力を取得しようとするとき。

于 2013-02-12T00:08:26.047 に答える