16

getsユーザーがエンターキーを押すまで、スクリプトの出力を一時停止するために使用しています。スクリプトに引数を渡さなければ、問題なく動作します。ただし、スクリプトに引数を渡すと、次のエラーで死ぬ:

ruby main.rb -i
main.rb:74:in `gets': No such file or directory - -i (Errno::ENOENT)
    from main.rb:74:in `gets'
    ...

エラー メッセージは、スクリプトに渡した引数を示しています。なぜARGVを見ているのですか?

コマンドライン引数を解析するために OptionParser を使用しています。parse!代わりに使用するとparse(引数リストから解析するものを削除するため)、アプリケーションは正常に動作します。

したがって、何らかの理由で gets が ARGV から読み取っているようです。なんで?これは期待されていますか?それを行わないようにする方法はありますか(実行gets()しても役に立ちませんでした)。

4

2 に答える 2

28

Ruby は自動的に解析されていない引数をファイル名として扱い、ファイルを開いて読み取り、入力をARGF( $<) で使用できるようにします。デフォルトでは、getsARGF から読み取ります。それをバイパスするには:

$stdin.gets

STDINの代わりに を使用することが提案されていますが$stdin、通常はを使用する方が適切$stdinです。

さらに、 から必要な入力を取得した後ARGV、次を使用できます。

ARGV.clear

getsそうすれば、読み取るつもりのないファイルから読み取ることなく、自由に使用できます。

于 2010-01-30T04:55:35.853 に答える
4

要点Kernel#gets、プログラムに渡された引数をファイル名として扱い、それらのファイルを読み取ることです。ドキュメントの最初の文は次のとおりです。

ARGV (または $*) のファイルのリストから次の行を返します (そして $_ に代入します)

それがまさに仕組みgetsです。特定の IOオブジェクト (たとえば)から読み取りたい場合は、そのオブジェクト$stdinを呼び出すだけgetsです。

于 2010-01-30T04:56:49.970 に答える