0Pricing
Ruby Academy · レッスン

reduce と each_with_object

コレクションを集約します。

「reduce と each_with_object」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。

reduceとは

reduce(別名はinject)は、すべての要素を1つの値にまとめます。ブロックにはアキュムレーターと現在の要素が渡されます。

sum = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts sum

アキュムレーターの動作

アキュムレーターは、反復処理の間、計算途中の結果を保持します。ブロックが返した値が、次のアキュムレーターになります。

[1, 2, 3].reduce(0) do |acc, n|
  puts "acc=#{acc} n=#{n}"
  acc + n
end

開始値なしのreduce

初期値を指定しない場合は、最初の要素がアキュムレーターになり、2番目の要素から反復が始まります。

puts [10, 20, 30].reduce { |acc, n| acc + n }

シンボルを使ったreduce

単純な演算子なら、ブロックの代わりに:+や:*のようなシンボルを渡せます。

puts [1, 2, 3, 4].reduce(:+)
puts [1, 2, 3, 4].reduce(:*)

最大値を求める

reduceでは、合計だけでなく最大値なども計算できます。

nums = [3, 9, 2, 7]
max = nums.reduce { |acc, n| n > acc ? n : acc }
puts max

文字列の作成

アキュムレーターには、組み立てていく文字列など、任意の型を使えます。

letters = ["r", "u", "b", "y"]
word = letters.reduce("") { |acc, c| acc + c.upcase }
puts word

each_with_objectとは

each_with_objectはreduceに似ていますが、可変オブジェクトを渡すと、そのオブジェクトが自動的に返されます。ブロック内でオブジェクトを変更します。

result = [1, 2, 3].each_with_object([]) do |n, arr|
  arr << n * 2
end
puts result.inspect

ハッシュの作成

each_with_objectはハッシュの作成に最適です。毎回オブジェクトを返す必要がないためです。

words = ["apple", "pear"]
lengths = words.each_with_object({}) do |w, h|
  h[w] = w.length
end
puts lengths

出現回数を数える

デフォルト値を持つハッシュとeach_with_objectを組み合わせると、項目の出現回数を集計できます。

votes = ["a", "b", "a", "a"]
tally = votes.each_with_object(Hash.new(0)) do |v, h|
  h[v] += 1
end
puts tally

reduceとeach_with_objectの比較

各ステップで新しい値を返す場合(合計や積など)はreduceを使います。1つのコンテナを変更する場合(配列やハッシュなど)はeach_with_objectを使います。

puts [1, 2, 3].reduce(:+)
puts [1, 2, 3].each_with_object([]) { |n, a| a << n }.inspect

tallyによる省略記法

数え上げには、処理を代わりに行ってくれる組み込みのtallyメソッドがあります。

puts ["a", "b", "a"].tally

クイックチェック

集計のスキルを確認しましょう。

まとめ

コレクションを集計できるようになりました。

  • アキュムレーター、開始値、またはシンボルを使ったreduce/inject
  • 配列やハッシュの作成に使うeach_with_object
  • すばやい数え上げに使うtally
  • 新しい値を作る場合はreduce、可変コンテナを使う場合はeach_with_objectを選ぶ

次のコースは、数値と数学です。

puts (1..5).reduce(:*)

よくある質問

「reduce と each_with_object」レッスンは無料ですか?

はい。「reduce と each_with_object」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。

「reduce と each_with_object」で何を学びますか?

コレクションを集約します。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Ruby Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「reduce と each_with_object」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このRuby Academyレッスンでコードを書いて実行できますか?

はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 範囲の作成
  2. Enumerable モジュール
  3. map、select、reject
  4. reduce と each_with_object
← Ruby Academyに戻る