[Rails] Ruby 4.1の stabby lambda 構文に対応したProc#source_location処理の改善

rails/rails

背景

Ruby 4.1では、Proc#source_locationの挙動が変更され、stabby lambda(->)構文で定義されたProcのソースコード位置情報がより正確になりました。具体的には、start_columnの値がlambda定義の先頭(->の位置)を指すようになったため、既存のソースコード抽出ロジックではstabby lambda記法がそのまま残ってしまう問題が発生しました。

この変更は、RailsのテストアサーションでProcのソースコードを文字列化する際に影響を与えるため、Ruby 4.1との互換性を保つための対応が必要となりました。

技術的な変更内容

修正箇所

Active Supportの_callable_to_source_stringメソッドにおいて、ソースコードから stabby lambda 記法を除去する処理が追加されました。

変更後:

def _callable_to_source_string(callable)
  # ... 既存の処理 ...
  lines[0] = lines[0].byteslice(location[1]...)
  source = lines.join.strip

  # Strip stabby lambda from Ruby 4.1+
  source = source.sub(/^->\s*/, "")

  # We ignore procs defined with do/end as they are likely multi-line anyway.
  if source.start_with?("{")
    source.delete_suffix!("}")
  end
  # ...
end

処理の詳細

source.sub(/^->\s*/, "") により、以下の変換が行われます:

  • -> { code }{ code }
  • -> { code }{ code } (スペースも含めて除去)

この処理により、Ruby 4.1以降でも従来通り、波括弧で囲まれたlambda本体のみを抽出できるようになります。

影響範囲

この変更は主にテストアサーションの内部処理に影響します。具体的には、assert_changesassert_differenceなどのアサーションメソッドで、Procのソースコードをエラーメッセージに含める際の表示が改善されます。

Ruby 3.x系では従来通りの動作が維持され、Ruby 4.1以降では新しいsource_locationの挙動に適切に対応します。後方互換性を保ちながら、将来のRubyバージョンへの対応を実現した変更です。

まとめ

このバックポートにより、Rails 8.0安定版でもRuby 4.1のProc#source_locationの変更に対応できるようになりました。stabby lambda記法を正規表現で除去するシンプルな実装により、最小限の変更でRuby 4.1互換性を確保しています。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

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

品質レビュー結果

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

Review Criteria:

ガイドライン準拠 ⚠ WARNING

記事構成とDiffDaily Styleへの準拠状況

記事構成、対象読者への適合性は適切です。コードブロック前後の空行も正しく挿入されています。ただし、記事末尾のGitHub PRリンクの表記がガイドラインの `[#番号](URL)` 形式ではなく `[PR #番号](URL)` となっている点が軽微な逸脱です。

  • 記事構成(Title、Context、Technical Detail)
  • DiffDaily Styleガイド準拠
  • カスタムMarkdown活用
  • 対象読者への適合性
技術的整合性 ✓ PASS

技術的な正確性と表現の適切性

PRのDiff内容を正確に引用し、変更点を分かりやすく解説できています。`Proc#source_location`や`stabby lambda`といった技術用語の使い方も正確で、説明の技術的妥当性も高く、信頼できる内容です。

  • 技術用語の正確性
  • コード例の正確性
  • 説明の技術的正確性
PR内容との整合性 ✓ PASS

元のPR情報との一致度

PRのタイトルや説明、関連PRの情報を基に、ハルシネーションなく事実を正確に記述できています。PR番号やRuby/Railsのバージョン番号などの固有名詞もすべて正確で、記事全体がPRの内容と完全に一致しています。

  • タイトル・説明の一致
  • Diff内容の正確な反映
  • 推測の排除