Kernel の Ractor ヘルパーを除外し、内部モジュールへ移行

rails/rails

このリバートにより、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.rbrequire_relative "kernel/ractor_shareability" 行も除去され、Kernel への直接的な依存がなくなっています。

内部モジュール導入: 新たに activesupport/lib/active_support/ractors.rb が追加され、module ActiveSupport::Ractors 内に make_shareableshareable?shareable_procshareable_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.rbautoload :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 のコードベースの保守性が向上しました。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
11d596eb

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文がタイトル直下に配置され、背景・技術的変更・設計判断・まとめという各論が続き、最後に結論としてまとめがあるので「総論→各論→結論」の構成が明確です。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックは ` ```ruby:ファイルパス` の形式で正しく記述されていますが、PRリンクの記法が一部 `[PR #57526](URL)` となっており、要求された `[#57526](URL)` 形式と一致していません。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

内容は Rails の内部実装に詳しいエンジニア向けで、初心者向けの余計な説明はありません。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションは総論パラグラフで要点を示し、続く段落で具体的事実・コードを示し、最後にまとめがある。段落は 1 文がトピックセンテンスとなり、1 段落 1 トピックで、長すぎる段落は見られません。空行で区切りも適切です。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事中のコードスニペットは Diff に追加された `activesupport/lib/active_support/ractors.rb` の内容と一致しており、削除されたファイルや変更点も正しく言及されています。省略はありますが情報の正確性には影響していません。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「shims」「shareable」などの用語は PR や Diff と一致しており、誤用はありません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

技術的な主張(Kernel からの除外、ActiveSupport::Ractors への移行、autoload の追加等)はすべて PR の記述・Diff に裏付けられています。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事のすべての事実は PR のタイトル・説明・Diff から確認でき、推測や捏造はありません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR 番号やファイルパス等の数値は正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルは PR の意図(Kernel の Ractor ヘルパー除外)を正確に表現しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

外部知識(LTS、バージョンサポート状況等)への言及はなく、PR に基づく情報のみで構成されています。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現の歪曲はなく、PR の記述と一致しています。