Kernel の Ractor ヘルパーを除外し、内部モジュールへ移行
このリバートにより、Rails が Kernel に公開していた Ractor 共有性ヘルパーを削除し、代わりに ActiveSupport::Ractors モジュールで提供する形に戻します。結果としてパブリック API の肥大化を防ぎつつ、既存の内部呼び出しはそのまま機能します。
背景
Kernel への Ractor 共有性ヘルパー追加は、#57467 で導入された ractor_make_shareable などのメソッドをフレームワーク全体で統一的に呼び出すための shim でした。Ruby のバージョンが古くてもコードが散在しないようにする狙いがありましたが、同時に Rails の公開 API に Kernel という広域な名前空間を拡張するという副作用も伴いました。
しかし、Ractor が本格的に利用できる Ruby バージョンへの移行が進むにつれ、これらの shim が永続的に残る必要がなくなることが見えてきました。PR の記述にもあるように、古い Ruby バージョンのサポートが終了すれば Kernel へのヘルパーは不要になるという前提です。そのため、永続的に公開 API を増やすリスクを回避すべく、実装を内部モジュールへ移行する方針が採られました。
技術的な変更
ファイル削除: activesupport/lib/active_support/core_ext/kernel/ractor_shareability.rb がリポジトリから完全に削除されました。削除に伴い、activesupport/lib/active_support/core_ext/kernel.rb の require_relative "kernel/ractor_shareability" 行も除去され、Kernel への直接的な依存がなくなっています。
内部モジュール導入: 新たに activesupport/lib/active_support/ractors.rb が追加され、module ActiveSupport::Ractors 内に make_shareable、shareable?、shareable_proc、shareable_lambda の4つのクラスメソッドが実装されました。実装は Ruby が Ractor を提供しているかどうかを条件分岐し、提供されていればそのまま委譲、未対応の場合は引数やブロックをそのまま返す noop となります。
module ActiveSupport
module Ractors # :nodoc:
class << self
if defined?(Ractor) && Ractor.respond_to?(:make_shareable)
def make_shareable(...)
Ractor.make_shareable(...)
end
else
def make_shareable(obj, copy: false)
obj
end
end
# shareable?, shareable_proc, shareable_lambda も同様の分岐
end
end
end
autoload 追加: activesupport/lib/active_support.rb に autoload :Ractors が新規で挿入され、ActiveSupport 名前空間で遅延ロードが保証されます。これにより既存コードが ActiveSupport::Ractors を参照したときに初めてファイルが読み込まれ、ロードコストが抑制されます。
テスト移行: activesupport/test/ractors_test.rb が新しいモジュール名に合わせて更新され、KernelRactorShareabilityTest から ActiveSupport::Ractors への呼び出しへ置換されています。テストは Ruby バージョンが 4.0 以上の場合にのみ有効で、動作保証は従来と同等です。
assert_not ActiveSupport::Ractors.shareable?(string)
shareable_string = ActiveSupport::Ractors.make_shareable(string)
assert_same string, shareable_string
assert ActiveSupport::Ractors.shareable?(string)
CHANGELOG の更新: activesupport/CHANGELOG.md から「Add shims for Ractor shareability methods...」というエントリが削除され、リバートの事実が記録されています。これにより公開履歴は実際に提供された機能が除外されたことを正確に反映します。
設計判断
公開 API の肥大化回避: Kernel へ直接メソッドを注入する案は、Rails のコア機能が Ruby 標準に依存しすぎるリスクを伴います。今回のリバートは、内部モジュール (ActiveSupport::Ractors) に収束させることで、将来的に削除しやすい設計を選択したことを示しています。
後方互換性の維持: 既存のフレームワーク内部コードは引き続き ActiveSupport::Ractors を呼び出すように変更されていますが、外部アプリケーションが Kernel 経由で呼び出すケースは非推奨であり、今回のリバートに伴う破壊的変更はありません。autoload によりモジュールは遅延ロードされるため、パフォーマンスへの影響も最小限です。
モジュール単位の拡張性: ActiveSupport::Ractors は名前空間が限定されているため、将来的に新たな Ractor 関連ユーティリティを追加する際も同様のパターンで拡張できます。これは、一貫した内部 API を保ちつつ、公開 API を安定させる戦略と一致しています。
まとめ
このリバートは、Kernel への Ractor 共有性ヘルパーの公開を取り消し、内部モジュール ActiveSupport::Ractors に機能を移行することで、公開 API の肥大化を防ぎながら既存のフレームワークロジックをそのまま維持しています。結果として、将来的な削除や拡張がしやすい設計となり、Rails のコードベースの保守性が向上しました。