Ractor共有性メソッドのシムをKernelに追加

rails/rails

Active SupportのRactor対応を進める第一歩として、Ractor.make_shareableなどの共有性APIをRubyバージョンを意識せずに呼び出せるKernel拡張が追加されました。シムはRuby環境に応じて実際のRactorメソッドへの委譲またはno-opに切り替わり、フレームワーク全体でのバージョン分岐コードを排除します。

背景

RailsはRactorサポートの追加に向けて動き出しており、フレームワーク各所でRactor.make_shareableRactor.shareable_procを呼び出す必要が生じます。しかしRactorのAPIは全てのRubyバージョンで利用可能ではないため、そのまま呼び出せば環境によってエラーが発生します。

従来のアプローチでは呼び出し箇所ごとにdefined?(Ractor) && Ractor.respond_to?(:make_shareable)のようなガード節を書く必要があり、コードベース全体に同様のチェックが散在することになります。このPRはそうした重複を解消するシム(互換レイヤー)を一か所に集約することを目的としています。

PR内ではシムの置き場所としてRactorShareability.shareable?のようなモジュールスコープの実装案も言及されていますが、最終的にはKernelへの拡張が採用されています。

技術的な変更

新ファイル activesupport/lib/active_support/core_ext/kernel/ractor_shareability.rb が追加され、Kernelモジュールに4つのプライベートメソッドが定義されました。各メソッドはdefined?(Ractor) && Ractor.respond_to?(:メソッド名)をモジュール評価時(ロード時)に一度だけ判定し、2つのメソッド定義を切り替えるという構造を取っています。

追加されたメソッドは以下の4つです:

  • ractor_make_shareable(obj, copy: false): Ractor.make_shareable(obj, copy: copy) に委譲、または obj をそのまま返す
  • ractor_shareable?(obj): Ractor.shareable?(obj) に委譲、または obj をそのまま返す
  • ractor_shareable_proc { ... }: Ractor.shareable_proc { ... } に委譲、または渡されたブロックをそのまま返す
  • ractor_shareable_lambda { ... }: Ractor.shareable_lambda { ... } に委譲、または渡されたブロックをそのまま返す

実装の核心部分を以下に示します:

module Kernel
  private
    if defined?(Ractor) && Ractor.respond_to?(:make_shareable)
      def ractor_make_shareable(obj, copy: false)
        Ractor.make_shareable(obj, copy: copy)
      end
    else
      def ractor_make_shareable(obj, copy: false)
        obj
      end
    end

    if defined?(Ractor) && Ractor.respond_to?(:shareable?)
      def ractor_shareable?(obj)
        Ractor.shareable?(obj)
      end
    else
      def ractor_shareable?(obj)
        obj
      end
    end
end

バージョン判定が実行時ではなくロード時のifで行われる点が重要です。これにより、メソッド呼び出しのたびにdefined?(Ractor)を評価するオーバーヘッドが発生せず、該当環境では直接Ractorメソッドへ委譲する最小コストのパスが生成されます。

テストは RUBY_VERSION >= "4.0" の条件ブロック内に記述されており、ractor_make_shareableでオブジェクトが実際にshareable化されること、ractor_shareable_procractor_shareable_lambdaがそれぞれself:オプション付きで正しく動作することを検証しています。

設計判断

Kernelへの拡張という方式が採用されました。PRではRactorShareabilityのような専用モジュールへの配置案も示されていましたが、フレームワーク全体のあらゆる場所からプレフィックスなしで呼び出せることを優先した判断です。

no-opがnilfalseではなく引数や渡されたブロックをそのまま返す設計にも注目できます。これにより、Ractorが利用できない環境でも呼び出し結果をそのまま変数に代入して使用するコードが自然に動作します。ただしractor_shareable?がRactor非対応環境でオブジェクト自体(truthy値)を返す点は、boolean述語として扱う際に注意が必要です。

また、バージョン分岐をrespond_to?で行うことで、defined?(Ractor)が真でも特定メソッドが存在しない中間バージョンへの対応が可能になっています。

まとめ

このPRはRailsのRactor対応の布石として、バージョン判定ロジックをKernelの1ファイルに集約したシム層を確立しました。フレームワーク各所が単純なメソッド呼び出しを記述するだけでRuby環境の差異を透過的に扱えるようになり、今後のRactor対応コードの追加コストを大幅に下げる基盤が整いました。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
caa5b7df

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文(総論)、背景、技術的変更、設計判断(各論)、まとめ(結論)の3部構成が明確に適用されており、非常に分かりやすい記事構造です。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライト(```ruby:ファイルパス)とGitHubのPRリンク記法([#番号](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

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

「Ractor」「シム」「no-op」「Kernel拡張」といった用語を前提として話が進んでおり、専門知識を持つエンジニアという対象読者に適合しています。

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

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

各セクション、各パラグラフが総論→各論の構造を持ち、トピックセンテンスが先頭に配置されているため、非常に読みやすく理解しやすいです。1段落1トピックの原則も守られています。

Diff内容との照合 ✓ PASS

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

記事内で引用されているコードブロックはDiffに存在する内容と完全に一致しており、ファイル名も正確です。「実装の核心部分」として一部を抜粋している点も適切です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「シム」「no-op」「モジュール評価時」などの技術用語が、PRの文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

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

ロード時にメソッド定義を切り替える実装の利点や、「ractor_shareable?」がtruthy値を返すことへの注意喚起など、技術的に正確で深い洞察に基づいた解説がなされています。

事実の突合 ✓ PASS

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

記事内のすべての主張は、PRのDescriptionやDiffの内容によって裏付けられており、ハルシネーション(創作)は一切見られません。

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

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

PR番号(#57467)、メソッド名、ファイルパスなど、すべての数値・固有名詞が正確に記載されています。

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

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

記事のタイトル「Ractor共有性メソッドのシムをKernelに追加」は、PR「Add shims for Ractor shareability methods」の内容を的確に要約しています。

外部知識の正確性 ✓ PASS

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

PRで言及されていないバージョンのサポート状況やリリース日程など、外部知識の不適切な追加はありません。

時間表現の正確性 ✓ PASS

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

PRの「we are going to start adding Ractor support」という未来形の内容を、「Ractor対応を進める第一歩」「今後の...基盤が整いました」といった表現で正確に反映しています。