カテゴリ: Ruby 更新日: 2026/02/27

Rubyのreduceとinject入門!合計計算や集計を初心者向けに分かりやすく解説

reduce/inject 入門:合計・連結・ハッシュ集計の実例で理解
reduce/inject 入門:合計・連結・ハッシュ集計の実例で理解

先生と生徒の会話形式で理解しよう

生徒

「Rubyで配列の中にある数字を全部足したり、データを一つにまとめたりする方法はありますか?」

先生

「それには、reduceメソッドやinjectメソッドを使うのが一番ですよ。これらはデータを畳み込むための強力な道具です。」

生徒

「畳み込む?なんだか難しそうですね。初心者でも使いこなせるでしょうか?」

先生

「大丈夫です。雪だるまを作るように、少しずつ塊を大きくしていくイメージを持てば簡単です。具体的な実例を見ていきましょう!」

1. reduceとinjectとは何か?

1. reduceとinjectとは何か?
1. reduceとinjectとは何か?

Rubyのプログラミングにおいて、reduce(リデュース)とinject(インジェクト)は、配列などの複数のデータが入った入れ物から、一つの結果を作り出すための命令です。例えば、テストの点数が並んだリストから「合計点」を計算したり、バラバラの言葉を繋げて「一つの文章」にしたりするときに活躍します。

驚くかもしれませんが、この二つの命令は名前が違うだけで機能は全く同じです。プログラミングの世界では、これを別名(エイリアス)と呼びます。どちらを使っても間違いではありませんが、データの形を変えるという意味の「reduce」と、値を注入していくという意味の「inject」、自分がイメージしやすい方を選んで使いましょう。

2. 合計計算で理解する基本の動き

2. 合計計算で理解する基本の動き
2. 合計計算で理解する基本の動き

まずは一番簡単な「数字の合計」を出す方法で仕組みを理解しましょう。reduceの動きは、よく雪だるま作りに例えられます。小さな雪の玉(初期値)に、次々と雪(配列の要素)をくっつけて大きくしていく過程にそっくりだからです。

ここで、プログラムの書き方を見てみましょう。括弧の中にある0が、雪だるまの芯となる「初期値」です。


numbers = [10, 20, 30, 40]

# 0をスタートにして、数字を順番に足していく
total = numbers.reduce(0) do |sum, n|
  sum + n
end

puts "合計は#{total}です"

実行結果は以下のようになります。


合計は100です

このプログラムの中にあるsumは、それまでの合計を蓄えておく「貯金箱」のような変数です。そしてnは、配列から新しく取り出された数字です。sum + nが計算されるたびに、貯金箱の中身が更新され、最後に残った値がtotalに代入されます。

3. 連結処理で文字を繋げてみよう

3. 連結処理で文字を繋げてみよう
3. 連結処理で文字を繋げてみよう

reduceは数字の計算だけでなく、文字(文字列)を繋げることにも使えます。例えば、バラバラの単語を組み合わせて、一つの挨拶文を作ってみましょう。文字を繋げる場合は、初期値を空の文字("")にするのがポイントです。

これをマスターすると、大量のデータから文章を組み立てる自動生成プログラムなども作れるようになります。


words = ["Ruby", "は", "とても", "楽しい"]

# 空の文字からスタートして、単語を繋げる
sentence = words.inject("") do |result, word|
  result + word
end

puts sentence

実行結果は以下のようになります。


Rubyはとても楽しい

先ほどの数字の例と同じように、resultという変数にどんどん文字が継ぎ足されていく様子が分かりますね。このように、複数の要素を一つに「畳み込む」のが、このメソッドの得意技です。

4. 初期値の重要性を学ぼう

4. 初期値の重要性を学ぼう
4. 初期値の重要性を学ぼう

ここで、reduce(0)inject("")の括弧の中に書く初期値について深掘りしましょう。初期値は、計算を始める前の「最初の状態」を決める非常に重要な設定です。もし初期値を指定しない場合は、配列の最初の要素が自動的に初期値として使われます。

しかし、パソコン操作に慣れていない方やプログラミング初心者の方は、慣れるまでは必ず初期値を書くようにしましょう。なぜなら、初期値を決めることで「今から数字の計算をするのか」「文字の連結をするのか」をコンピュータに明確に伝えることができ、予期せぬエラーを防げるからです。

5. ハッシュを使った高度な集計

5. ハッシュを使った高度な集計
5. ハッシュを使った高度な集計

一歩進んだ使い方として、データの個数を数える「集計」に挑戦してみましょう。ここではハッシュという、名前と値をセットで管理する道具を使います。例えば、アンケートの結果から「どの果物が何票入ったか」を数えることができます。

初期値にHash.new(0)と書くことで、「まだ何も数えていない、全ての項目が0から始まる表」を用意することができます。


votes = ["リンゴ", "バナナ", "リンゴ", "ミカン", "バナナ", "リンゴ"]

# 果物の名前を数えて、表(ハッシュ)にまとめる
result = votes.reduce(Hash.new(0)) do |counts, fruit|
  counts[fruit] += 1
  counts
end

puts result

実行結果は以下のようになります。


{"リンゴ"=>3, "バナナ"=>2, "ミカン"=>1}

このプログラムでは、新しい果物が出てくるたびに、表の中の数字を+1しています。最後にcounts(表そのもの)を返してあげることで、次のループでも更新された表を使い続けることができます。これは実務でも非常によく使われるテクニックです。

6. 記号だけで書ける魔法の省略形

6. 記号だけで書ける魔法の省略形
6. 記号だけで書ける魔法の省略形

Rubyには、もっと短く書くための魔法のような書き方があります。例えば合計を出すだけなら、do ... endを使わずに、記号一つで指示を出すことができます。これをシンボル形式と呼びます。

「とにかく配列の要素の間に+を挟んで計算して!」という命令を、たったこれだけで表現できるのです。非常にスッキリとしていて、ベテランのプログラマーも好んで使う書き方です。


prices = [120, 250, 400]

# 記号「:+」を渡すだけで、全部足してくれる
total_price = prices.reduce(:+)

puts "合計金額は#{total_price}円です"

実行結果は以下のようになります。


合計金額は770円です

初心者の方は、まず中身をしっかり書く方法(do ... end)を練習し、仕組みが理解できてからこの省略形を使うようにすると、プログラミングの基礎体力がつきますよ。

7. よくある間違いと解決策

7. よくある間違いと解決策
7. よくある間違いと解決策

reduceを使っているときに一番多いミスは、ブロック(do ... endの中身)の最後に、更新した値を書き忘れることです。reduceは、ブロックの中で最後に計算された値を、次のステップの貯金箱(sumresult)に引き継ぎます。

特にハッシュの集計などの複雑な処理をするときは、最後に必ず「これを使ってね」という変数を書く必要があります。もしこれを忘れると、貯金箱が空っぽになってしまい、エラーが発生したり、結果がバラバラになったりします。パソコンが思い通りに動かないときは、この「引き継ぎ」が正しく行われているかチェックしてみましょう。

8. reduceを使いこなすための心構え

8. reduceを使いこなすための心構え
8. reduceを使いこなすための心構え

最初は難しく感じるかもしれませんが、reduceは一度マスターすると手放せない非常に便利な道具です。まずは「たくさんのデータを一個にまとめる」という場面に出会ったら、「あ、reduceの出番だ!」と思い出してください。

プログラミングを始めたばかりの頃は、英単語の意味(reduce = 減らす、まとめる)を意識すると覚えやすくなります。複雑な処理を一つずつ命令するのではなく、コンピュータに「このルールでまとめておいて」と丸投げする。そんな感覚が掴めてくると、あなたのコードはよりRubyらしく、美しくなっていきます。

カテゴリの一覧へ
新着記事
New1
Ruby
Rubyで学ぶビット演算入門:&・|・^・~・<<・>>の基礎と実例
New2
Rails
RESTとRailsの関係を徹底解説!resources設計と7つの標準アクションを初心者向けにわかりやすく解説
New3
データベース
MySQLアーキテクチャ入門!初心者向けに基本構造と仕組みを徹底解説
New4
Ruby
Rubyのtake/drop/take_while/drop_whileを完全ガイド!配列を切り出す基本テクニック
人気記事
No.1
Java&Spring記事人気No1
Ruby
Rubyのreduceとinject入門!合計計算や集計を初心者向けに分かりやすく解説
No.2
Java&Spring記事人気No2
Ruby
Rubyの始め方ガイド:インストールから最初のHello Worldまで(Windows/Mac/Linux)
No.3
Java&Spring記事人気No3
Ruby
Rubyの文字列エンコーディング完全ガイド!Encoding・force_encoding・encodeを初心者向け解説
No.4
Java&Spring記事人気No4
データベース
PostgreSQLのWHERE句を徹底解説!初心者でもわかるSQLデータ抽出の基本
No.5
Java&Spring記事人気No5
データベース
PostgreSQLで順位付け!ROW_NUMBER関数の使い方を初心者向けに徹底解説
No.6
Java&Spring記事人気No6
Ruby
Rubyのfind/detect/find_indexを徹底解説!目的のデータを素早く探す方法
No.7
Java&Spring記事人気No7
Ruby
Rubyのselect/reject/filterの使い方を完全解説!初心者向けの条件抽出レシピ
No.8
Java&Spring記事人気No8
Ruby
Rubyで比較演算子を完全解説!==・===・<=>・eql? の使い分け