`number_to_delimited` のデフォルト動作を高速パスに統一
NumberToDelimitedConverter の DEFAULT_DELIMITER_REGEX を削除し、オプション未指定時も自動的に高速パスが使われるようになりました。これにより、delimiter_pattern: nil を明示しなくてもパフォーマンス最適化の恩恵を受けられます。
背景
コミット 2d485ae により、NumberToDelimitedConverter のパフォーマンス改善が行われました。この変更では、delimiter_pattern に nil を渡した場合に正規表現を使わない高速なコードパスを実行する仕組みが導入されています。
しかし、delimiter_pattern のデフォルト値として DEFAULT_DELIMITER_REGEX(/(\d)(?=(\d\d\d)+(?!\d))/)が定義されたままだったため、number_to_delimited(10000) のようにオプションを省略した通常の呼び出しでは、nil ではなくこの正規表現が渡される状態が続いていました。高速パスを利用するには number_to_delimited(10000, delimiter_pattern: nil) と明示する必要があり、実質的にほとんどのケースで最適化が機能しない状態でした。
本PRはこの挙動を「意図しないもの」と判断し、デフォルトで高速パスが使われるよう修正しています。
技術的な変更
NumberToDelimitedConverter から DEFAULT_DELIMITER_REGEX 定数を削除し、delimiter_pattern メソッドの戻り値をオプションの直接参照に変更しました。
変更前:
DEFAULT_DELIMITER_REGEX = /(\d)(?=(\d\d\d)+(?!\d))/
def delimiter_pattern
options.fetch(:delimiter_pattern, DEFAULT_DELIMITER_REGEX)
end
変更後:
def delimiter_pattern
options[:delimiter_pattern]
end
options.fetch(:delimiter_pattern, DEFAULT_DELIMITER_REGEX) は、キーが存在しない場合に正規表現オブジェクトを返すため、高速パスの条件(nil チェック)を満たしませんでした。options[:delimiter_pattern] に変更することで、:delimiter_pattern キーが指定されていない場合は nil が返るようになり、高速パスが確実に使われます。なお、delimiter_pattern: nil を明示的に渡した場合も同様に nil が返るため、従来の明示的な指定との動作に差はありません。カスタムパターンを使いたい場合は引き続き delimiter_pattern: オプションに正規表現を渡せば機能するため、後方互換性も維持されています。
まとめ
この変更は、パフォーマンス改善として導入されたコードパスが実際には大多数のケースで機能していなかったという問題を2行の差分で修正したものです。options.fetch によるデフォルト値の提供から options[] による単純な参照へのシフトにより、明示的なオプション指定なしに高速パスが適用され、元のコミットが意図した最適化が設計全体に一貫して反映されます。