[Rails] Array#in_groupsに入力値検証を追加

rails/rails

なぜこの変更が必要だったのか

RailsのActiveSupportには、配列を複数のグループに分割する便利なメソッドとして Array#in_groupsArray#in_groups_of が用意されています。しかし、Array#in_groups には引数の妥当性チェックが実装されていませんでした。

#56608 で報告されたように、in_groups(0)in_groups(-1) のような無効な引数を渡すと、意味不明なエラーメッセージが表示されていました。一方、類似メソッドの in_groups_of には適切な入力検証が実装されており、この不整合が問題視されていました。

実装された変更内容

入力値検証ロジックの追加

Array#in_groups メソッドに、以下の検証ロジックが追加されました。

def in_groups(number, fill_with = nil, &block)
  if number.to_i <= 0
    raise ArgumentError,
      "Number of groups must be a positive integer, was #{number.inspect}"
  end

  number = number.to_i
  # 既存の実装が続く...
end

この変更により、以下の挙動が保証されます。

  1. 正の整数のみ受け付ける: number.to_i <= 0 の場合は ArgumentError を発生させる
  2. 明確なエラーメッセージ: 何が問題だったのかを具体的に示す
  3. 整数への変換: 検証後に number.to_i で整数化することで、浮動小数点数も適切に処理できる

テストケースの拡充

今回の変更では、以下のテストケースが追加されました。

def test_in_groups_invalid_argument
  assert_raises(ArgumentError) { [].in_groups(0) }
  assert_raises(ArgumentError) { [].in_groups(-1) }
  assert_raises(ArgumentError) { [].in_groups(nil) }
end

def test_in_groups_with_float
  result = [1, 2, 3, 4, 5].in_groups(2.9)
  assert_equal 2, result.size
  assert_equal [[1, 2, 3], [4, 5, nil]], result
end

注目すべき点として、浮動小数点数 2.9 を渡した場合、to_i により 2 として処理されます。これは既存の in_groups_of メソッドと同じ挙動です。

実用例

変更前(エラーメッセージが不明瞭):

[1, 2, 3].in_groups(0)
# => 不明瞭なエラーまたは予期しない挙動

変更後(明確なエラーメッセージ):

[1, 2, 3].in_groups(0)
# => ArgumentError: Number of groups must be a positive integer, was 0

[1, 2, 3].in_groups(-1)
# => ArgumentError: Number of groups must be a positive integer, was -1

[1, 2, 3].in_groups(nil)
# => ArgumentError: Number of groups must be a positive integer, was nil

正常な使用例:

[1, 2, 3, 4, 5].in_groups(2)
# => [[1, 2, 3], [4, 5, nil]]

[1, 2, 3, 4, 5].in_groups(2.9)  # 浮動小数点数も可能
# => [[1, 2, 3], [4, 5, nil]]  # 2グループとして処理される

まとめ

この変更により、Array#in_groupsArray#in_groups_of の挙動が統一され、不正な引数に対して一貫性のあるエラーハンドリングが実現されました。開発者はより明確なフィードバックを得られるようになり、デバッグ時間の短縮が期待できます。

記事メタデータ

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への準拠状況

記事構成、カスタムMarkdown構文、対象読者への適合性のすべてのガイドラインを完璧に満たしています。特に、コードブロック前後の空行やファイル名付きシンタックスハイライト、GitHubリンク記法が正しく使用されており、可読性が非常に高いです。

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

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

記事内のコード引用や技術的な説明は、PRの変更内容と完全に一致しています。特に、`to_i`による浮動小数点数の扱いや、追加されたテストケースまで含めて解説しており、技術的に正確かつ詳細です。

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

元のPR情報との一致度

PRのタイトル、目的(Issue #56608の修正)、具体的な変更内容がすべて記事に正確に反映されています。PR情報から逸脱した推測や憶測は一切なく、ハルシネーションは見られません。

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