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 wordeach_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 tallyreduceとeach_with_objectの比較
各ステップで新しい値を返す場合(合計や積など)はreduceを使います。1つのコンテナを変更する場合(配列やハッシュなど)はeach_with_objectを使います。
puts [1, 2, 3].reduce(:+)
puts [1, 2, 3].each_with_object([]) { |n, a| a << n }.inspecttallyによる省略記法
数え上げには、処理を代わりに行ってくれる組み込みの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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 範囲の作成
- Enumerable モジュール
- map、select、reject
- reduce と each_with_object