Ruby 正規表現が文字列以外のものと照合する場合、to_str
そのオブジェクトに対してメソッドが呼び出され、照合する実際の文字列が取得されます。この動作は避けたいです。文字列ではないオブジェクトに対して正規表現を一致させたいのですが、論理的にはランダムにアクセス可能なバイトのシーケンスと考えることができ、それらへのすべてのアクセスはbyte_at()
メソッドを介して仲介されます (精神的には Java のCharSequence.char_at()
メソッドに似ています)。
たとえば、任意の正規表現の任意のファイルでバイト オフセットを見つけたいとします。式は複数行になる可能性があるため、一度に 1 行ずつ読み取って各行で一致を探すことはできません。ファイルが非常に大きい場合、すべてをメモリに収めることができないため、1 つの大きな文字列として読み取ることはできません。ただし、ファイルの n 番目のバイトを取得するメソッドを定義するのは簡単です (速度のために必要に応じてバッファリングとキャッシュを使用します)。
最終的には、 Ruby Quiz #137のように、完全な機能を備えたロープクラスを作成し、文字列に変換することによるパフォーマンスの低下なしに正規表現を使用できるようにしたいと考えています。
Ruby の正規表現の実装の内部に深く入り込みたくないので、洞察をいただければ幸いです。