shareable_lambda の記述をブロック形式へ統一

rails/rails

ActionPack と ActiveSupport で使用されている ActiveSupport::Ractors.shareable_lambda の定義が、&-> 形式から標準的なブロックリテラルへ置き換えられ、可読性が向上しました。振る舞いは変わりません。

背景

Rails の内部実装では Ractor 共有可能なラムダを定数化するために **ActiveSupport::Ractors.shareable_lambda が多数使用されています**。action_controller/metal.rbaction_dispatch/http/parameters.rbjourney/visitors.rb など複数のファイルで &-> 形式が採用されていました。&-> は Ruby の一般的な記法ではなく、読者に余計な認知負荷を与えていました。

PR #57859 はこれらの定義を統一的なブロック形式に書き換えることを目的としています。PR の説明では「見た目が分かりにくい」定義を「シンプルなブロックリテラルへ」統一すると述べられています。変更はコードの見た目をシンプルにし、レビュー時の理解コストを下げることが狙いです。

技術的な変更

action_controller/metal.rbINCLUDEEXCLUDENULL 定数がブロックリテラルへ変更されました

-      INCLUDE = ActiveSupport::Ractors.shareable_lambda(&->(list, action) { list.include? action })
-      EXCLUDE = ActiveSupport::Ractors.shareable_lambda(&->(list, action) { !list.include? action })
-      NULL    = ActiveSupport::Ractors.shareable_lambda(&->(list, action) { true })
+      INCLUDE = ActiveSupport::Ractors.shareable_lambda { |list, action| list.include? action }
+      EXCLUDE = ActiveSupport::Ractors.shareable_lambda { |list, action| !list.include? action }
+      NULL    = ActiveSupport::Ractors.shareable_lambda { |list, action| true }

引数とロジックは変更前後で同一であり、挙動は変わりません。

action_dispatch/http/parameters.rb の JSON パーサ定義がブロックリテラルへ置換されました

-        Mime[:json].symbol => ActiveSupport::Ractors.shareable_lambda(&-> (raw_post) {
+        Mime[:json].symbol => ActiveSupport::Ractors.shareable_lambda do |raw_post|
           data = ActiveSupport::JSON.decode(raw_post)
           data.is_a?(Hash) ? data : { _json: data }
-        })
+        end

JSON 解析のロジックはそのままで、記法だけが変更されています。

journey/visitors.rb のエスケープ定数がブロック形式に統一されました

-      ESCAPE_PATH    = ActiveSupport::Ractors.shareable_lambda(&->(value) { Router::Utils.escape_path(value) })
-      ESCAPE_SEGMENT = ActiveSupport::Ractors.shareable_lambda(&->(value) { Router::Utils.escape_segment(value) })
+      ESCAPE_PATH    = ActiveSupport::Ractors.shareable_lambda { |value| Router::Utils.escape_path(value) }
+      ESCAPE_SEGMENT = ActiveSupport::Ractors.shareable_lambda { |value| Router::Utils.escape_segment(value) }

エスケープ処理自体は変更されていません。

routing/mapper.rb の制約評価用ラムダがブロックリテラルへ変更されました

-        SERVE = ActiveSupport::Ractors.shareable_lambda(&->(app, req) { app.serve req })
-        CALL  = ActiveSupport::Ractors.shareable_lambda(&->(app, req) { app.call req.env })
+        SERVE = ActiveSupport::Ractors.shareable_lambda { |app, req| app.serve req }
+        CALL  = ActiveSupport::Ractors.shareable_lambda { |app, req| app.call req.env }

アプリケーション呼び出しロジックは保持されたままです。

routing/route_set.rb の URL ヘルパー生成ラムダがブロック形式に置き換えられました

-      PATH    = ActiveSupport::Ractors.shareable_lambda(&->(options) { ActionDispatch::Http::URL.path_for(options) })
-      UNKNOWN = ActiveSupport::Ractors.shareable_lambda(&->(options) { ActionDispatch::Http::URL.url_for(options) })
+      PATH    = ActiveSupport::Ractors.shareable_lambda { |options| ActionDispatch::Http::URL.path_for(options) }
+      UNKNOWN = ActiveSupport::Ractors.shareable_lambda { |options| ActionDispatch::Http::URL.url_for(options) }

URL 生成のアルゴリズムは変わりません。

active_support/log_subscriber.rb のログレベル判定ラムダがブロックリテラルへ統一されました

-      debug: ActiveSupport::Ractors.shareable_lambda(&-> (logger) { !logger.debug? }),
-      info: ActiveSupport::Ractors.shareable_lambda(&-> (logger) { !logger.info? }),
-      error: ActiveSupport::Ractors.shareable_lambda(&-> (logger) { !logger.error? }),
+      debug: ActiveSupport::Ractors.shareable_lambda { |logger| !logger.debug? },
+      info: ActiveSupport::Ractors.shareable_lambda  { |logger| !logger.info? },
+      error: ActiveSupport::Ractors.shareable_lambda { |logger| !logger.error? },

判定ロジックは同一で、記法が簡潔になっています。

設計判断

変更は API 互換性を保持したまま記述スタイルのみを変更するという方針に基づいていますshareable_lambda が生成するオブジェクトは同一で、引数の数や戻り値の型に差異はありません。そのため、既存の呼び出し側コードは影響を受けません。

ブロックリテラルへの統一は Ruby 標準の構文を利用することで、コード解析ツールや自動リファクタリングの対象として扱いやすくなります。可読性向上が唯一の目的であり、設計上のトレードオフはありません。

まとめ

今回の PR は ActionPack と ActiveSupport の複数箇所で ActiveSupport::Ractors.shareable_lambda の記述を &-> からブロックリテラルへ置き換え、コードの見た目をシンプルにしました。振る舞いは変わらず、既存の機能に対する影響はありません。可読性の向上により、開発者が意図をすぐに把握できるようになります。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
4d61e424

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

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文(総論)がタイトル直下にあり、背景・技術的変更・設計判断・まとめという各論と結論が明確に分かれている。必須要素がすべて揃っている。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライトは ```ruby:ファイルパス の形式で正しく記述され、GitHubリンクも [#57859](URL) の形で正しくリンク化されている。

対象読者への適合性 ✓ PASS

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

専門的なRails内部実装に焦点を当てており、初心者向けの余計な説明はなく、エンジニア向けに適切なレベルで書かれている。

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

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

各セクションは総論パラグラフ→各論パラグラフ→結論パラグラフの構成で、段落はトピックセンテンスで始まり1段落1トピック、長さも6文未満で適切に区切られている。

Diff内容との照合 ✓ PASS

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

記事中のコードブロックは提供されたDiffと完全に一致しており、削除・追加行ともに正確に反映されている。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

ActiveSupport::Ractors.shareable_lambda、ブロックリテラル、Ractor 共有可能ラムダ等の用語が正しく使用されている。

説明の技術的正確性 ✓ PASS

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

コード変更が見た目だけで機能に影響しないこと、API 互換性が保たれることなど、説明はPRの内容と一致して正確である。

事実の突合 ✓ PASS

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

全ての主張はPRの目的・Diffの変更内容に裏付けられており、根拠のない推測や外部情報は含まれていない。

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

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

PR番号 #57859 が正しく記載されており、その他数値や固有名詞の誤りはない。

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

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

記事タイトルはPRの内容「shareable_lambda の使用改善」=「記述統一」に沿っており、矛盾はない。

外部知識の正確性 ✓ PASS

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

バージョンサポートやリリーススケジュール等の外部知識は一切記載されておらず、PR情報のみで完結している。

時間表現の正確性 ✓ PASS

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

時間表現(既に、近い将来 等)は使用されておらず、PRの記述と食い違う表現もない。