【Ruby3.x】IO::each()メソッドの使い方
eachメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
eachメソッドは、IOオブジェクトの内容を、指定された区切り文字で区切って繰り返し処理を実行するメソッドです。
このメソッドは、ファイルやパイプ、ネットワークソケットといったIOオブジェクトからデータを効率的に読み込み、その内容をブロックに渡して順次処理する際に利用されます。デフォルトでは、改行コード($/)を区切り文字として利用するため、ファイルを一行ずつ読み込む用途で非常によく使われます。
オプションとして、sep_string引数に任意の文字列を指定することで、区切りの基準を変更できます。例えば、特定の記号や単語でデータを分割して処理することが可能です。また、limit引数に数値を指定すると、一度に読み込むバイト数の上限を設定できます。これにより、非常に大きなデータの中から特定の部分だけを処理したり、メモリ使用量を抑えたりするのに役立ちます。
eachメソッドがブロックを伴って呼び出された場合、読み込んだ各データ片(通常は一行)をそのブロックに渡し、ブロック内の処理を実行します。一方、ブロックが省略された場合はEnumeratorオブジェクトを返します。このEnumeratorオブジェクトを利用することで、nextメソッドなどでデータを一つずつ取得したり、mapやselectといった他のEnumerableモジュールのメソッドと組み合わせて、より柔軟なデータ処理を行うことが可能になります。
処理が完了すると、このメソッドは元のIOオブジェクト自身を返します。これにより、メソッドチェーンを使った連続的な操作も行いやすくなっています。特に、ログファイルの解析や設定ファイルの読み込みなど、テキストデータを逐次処理する多くのシナリオで活躍する基本的なメソッドです。
構文(syntax)
1IO.open("data.txt", "r") do |io_object| 2 io_object.each do |line| 3 puts line.chomp 4 end 5end
引数(parameters)
separator = $/, limit = nil
- separator = $/ : 区切り文字を指定します。デフォルトは改行文字($/)です。
- limit = nil : 読み取る行数を制限します。nilの場合は制限なしです。
戻り値(return)
self または Enumerator
each メソッドは、IO オブジェクト自身(self)を返します。これは、メソッドチェーンを可能にするためです。ただし、ブロックが渡されなかった場合は、各要素を順番に生成する Enumerator オブジェクトが返されます。