0

irb を 1 回限りのテキスト前処理ツールとして実行しています。テキストを印刷するだけですぐに問題が発生しました。

foo = File.open "bar"
foo.each_line {|l| puts l}

これは意図したとおりに印刷され、 が返されます#<File:emails plaintext>

ただし、同じオブジェクトを再度呼び出すと#each_line、印刷は行われませんが、それでも返されます#<File:emails plaintext>

の呼び出しによってオブジェクトの内容Fileが上書きされるのはなぜ#each_lineですか? #eachのようなメソッドの存在理由は、突然変異が起こらないようにすることだと思いました。これを行うための適切な「ルビーの方法」は何ですか?

4

1 に答える 1

3

巻き戻す必要があります: foo.rewind.

$stdin.each_lineどのように振る舞うべきかを考えてください。IO オブジェクトはディスク上のファイルであったり、ストリームやパイプであったりするため、ランダムにシークできることを保証しても意味がありません。複数回繰り返したい場合は、配列にロードします。

于 2013-04-12T20:11:08.037 に答える