[Rails] Ruby 4.1のstabby lambda構文変更に対応したProc#source_location処理の修正

rails/rails

背景

Ruby 4.1では、stabby lambda(->)の構文においてProc#source_locationstart_columnの振る舞いが変更されました。これまでlambdaの本体({)から始まっていた位置情報が、->記号から始まるようになったため、Active Supportのテストアサーション機能で使用している_callable_to_source_stringメソッドが正しく動作しなくなる問題が発生しました。

この変更は、Ruby 4.1以降でRailsのテストを実行した際に、assert_differenceなどのアサーションメソッドでlambdaを使用したコードが期待通り動作しない原因となっていました。

技術的詳細

変更箇所

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

_callable_to_source_stringメソッドに、stabby lambda記号を取り除く処理を追加しています。この処理は、ソースコードの先頭から->とそれに続く空白文字を削除します。

Ruby 4.1での動作変化

Ruby 4.0以前:
```ruby
lambda = -> { 1 + 1 }
lambda.source_location

=> ["file.rb", 1, 3] # '{' の位置から開始


**Ruby 4.1以降:**
```ruby
lambda = -> { 1 + 1 }
lambda.source_location
# => ["file.rb", 1, 0]  # '->' の位置から開始

この変更により、byteslice(location[1]...)で切り出されたソース文字列が"-> { 1 + 1 }"となり、start_with?("{")のチェックが失敗するようになりました。

修正の影響

今回の修正により、Ruby 4.1以降でも以下のようなテストコードが正常に動作します:

assert_difference -> { User.count }, 1 do
  User.create!(name: "Alice")
end

この修正は後方互換性を保っており、Ruby 4.0以前でも問題なく動作します。Ruby 4.0以前ではsource変数に"->"が含まれていないため、subメソッドは何も置換せずに元の文字列を返します。

影響範囲

この変更は8.1系の安定版ブランチへのバックポートであり、Ruby 4.1以降を使用する環境でRails 8.1を利用する場合に必要な修正です。Active Supportのテストアサーション機能を使用しているすべてのテストコードが対象となります。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

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

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

ガイドライン準拠 ✓ PASS

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

記事構成(Title, Context, Technical Detail)、カスタムMarkdown構文(コードブロックの空行、ファイル名指定、GitHubリンク)、対象読者への適合性のすべての項目でガイドラインを完全に遵守しています。特にコードブロック前後の空行が徹底されており、可読性が非常に高いです。

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

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

Diffの内容を正確に引用しており、技術用語(stabby lambda, Proc#source_location)の使用も適切です。Ruby 4.1での動作変更の根本原因と、それに対する修正(`sub`による文字列置換)の技術的説明が論理的かつ正確です。

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

元のPR情報との一致度

PRのタイトルやコード変更から読み取れる事実のみに基づいて記事が構成されており、ハルシネーションは一切見られません。PR番号や言及されているRuby/Railsのバージョンも正確です。記事の主題はPRの内容と完全に一致しています。

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