【Ruby3.x】StringIO::ungetbyte()メソッドの使い方
ungetbyteメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
ungetbyteメソッドは、StringIOクラスのインスタンスに対して、読み取り位置を操作し、直前に読み取ったバイト、または指定したバイトを「読み取り待ち」の状態に戻すことを可能にするメソッドです。
StringIOオブジェクトは、メモリ上の文字列データをあたかもファイルであるかのように扱い、そこからバイト単位でデータを読み書きできます。ungetbyteメソッドは、このStringIOオブジェクトから既に1バイトのデータを読み取った後で、そのバイトを読み取り位置の先頭に戻す役割を持ちます。
具体的には、このメソッドは引数として、戻したい1バイトの文字列(例: "A")またはそのバイト値を表す整数(例: 65)を受け取ります。Ruby 3の環境では、引数を省略して呼び出すことも可能で、その場合は直前にgetbyteやreadbyteなどのメソッドで読み取られたバイトが自動的に読み取り位置の先頭に戻されます。これにより、次にデータを読み取る際には、この戻されたバイトが再び読み込まれることになります。
この機能は、特にテキストデータやバイナリデータを解析する際に非常に有効です。例えば、プログラムが次の文字を一時的に「先読み」して、その文字の内容に応じて処理を分岐させたい場合や、誤って余分なデータを読み取ってしまった場合に、読み取り位置を元に戻して再処理したい場合などに利用されます。ungetbyteメソッドを使用することで、データの読み取りと処理の流れを細かく制御し、より複雑で柔軟なデータ解析ロジックを効率的に実装できます。
構文(syntax)
1require 'stringio' 2 3# StringIOオブジェクトを作成し、初期データを設定 4io = StringIO.new("abcde") 5 6# 最初の2バイトを読み込む 7io.read(2) # => "ab" 8# 現在の読み取り位置は 'c' の前 9 10# "XY" を読み取り位置の前に戻す 11io.ungetbyte("XY") 12 13# 次に読み込むと "XY" が最初に返され、その後元のデータが続く 14puts io.read(3) # => "XYc"
引数(parameters)
byte
- byte: StringIOオブジェクトのバッファの先頭に挿入する1バイトの整数
戻り値(return)
self
StringIO クラスの ungetbyte メソッドは、自身(self)を返します。これにより、メソッドチェーンを繋げることが可能になります。