[Rails] Ruby 3.3未満の互換性コードを削除

rails/rails

背景

RailsのmainブランチがRuby 3.3以上を必須とすることに伴い、古いRubyバージョンとの互換性を保つために実装されていたコードが不要になりました。この変更は、コードベースをよりシンプルに保ち、保守性を向上させることを目的としています。

削除された互換性コード

1. SecureRandomのパラメータチェック

Ruby 3.3以降では SecureRandom.alphanumeric が常に2つのパラメータ(長さと文字セット)を受け取れるようになりました。これにより、Ruby 3.2以前のための分岐処理が不要になりました。

変更前:

if SecureRandom.method(:alphanumeric).parameters.size == 2
  def self.base58(n = 16)
    alphanumeric(n, chars: BASE58_ALPHABET)
  end
else
  def self.base58(n = 16)
    SecureRandom.random_bytes(n).unpack("C*").map do |byte|
      idx = byte % 64
      idx = SecureRandom.random_number(58) if idx >= 58
      BASE58_ALPHABET[idx]
    end.join
  end
end

変更後:

def self.base58(n = 16)
  alphanumeric(n, chars: BASE58_ALPHABET)
end

この変更は base58base36base32 の3つのメソッドすべてに適用されています。Ruby 3.2以前では alphanumeric メソッドがカスタム文字セットをサポートしていなかったため、バイト配列を手動で処理する実装が必要でしたが、Ruby 3.3以降はシンプルな実装で統一できます。

2. Range#overlap?メソッド

Ruby 3.3で Range#overlap? がコアに追加されたため、Active Supportでの独自実装が削除されました。

削除されたコード:

unless Range.method_defined?(:overlap?)
  def overlap?(other)
    raise TypeError unless other.is_a? Range

    self_begin = self.begin
    other_end = other.end
    other_excl = other.exclude_end?

    return false if _empty_range?(self_begin, other_end, other_excl)

    other_begin = other.begin
    self_end = self.end
    self_excl = self.exclude_end?

    return false if _empty_range?(other_begin, self_end, self_excl)
    return true if self_begin == other_begin

    return false if _empty_range?(self_begin, self_end, self_excl)
    return false if _empty_range?(other_begin, other_end, other_excl)

    true
  end

  private
  def _empty_range?(b, e, excl)
    return false if b.nil? || e.nil?

    comp = b <=> e
    comp.nil? || comp > 0 || (comp == 0 && excl)
  end
end

Ruby 3.3以降では、Rangeクラスに標準で overlap? メソッドが実装されているため、この複雑な互換性コードは不要になりました。エイリアス overlaps? は引き続き提供されます。

3. Fiber#killメソッド

Ruby 3.3で Fiber#kill が追加されたため、テストコード内のモックメソッドが削除されました。

削除されたコード:

unless method_defined?(:kill)
  def kill
  end
end

これは、コネクションプールのテストで使用されていた擬似Fiberクラスの互換性メソッドです。Ruby 3.3以降では実際に Fiber#kill が存在するため、この定義は不要になりました。

影響範囲

この変更により、Railsの内部実装がよりシンプルになり、Ruby 3.3の新機能を直接利用できるようになりました。アプリケーション開発者への直接的な影響はありませんが、Rails 8.0以降ではRuby 3.3未満のバージョンでは動作しなくなります。

記事メタデータ

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:

ガイドライン準拠 ✓ PASS

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

記事構成の3要素(Title, Context, Technical Detail)が明確に記載されています。コードブロック前後の空行やファイル名付きシンタックスハイライトなど、カスタムMarkdown構文も正しく使用されており、可読性が高いです。対象読者であるエンジニアに適した技術レベルで書かれています。

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

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

PRの趣旨である「Ruby 3.3未満の互換性コード削除」を正確に反映しています。SecureRandom, Range#overlap?, Fiber#killに関するコードの引用と説明は、技術的に正確で論理的です。Ruby本体の変更とRails側の対応という因果関係が明確に示されています。

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

元のPR情報との一致度

PRのタイトルと内容に完全に一致しており、ハルシネーションは見られません。記事内のすべての主張は、PRの目的やコード変更から裏付けられています。「Rails 8.0以降ではRuby 3.3未満では動作しない」という影響範囲に関する記述も、PRの背景から導かれる妥当な情報であり、読者にとって有益です。

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