LoginSignup
5
4

More than 5 years have passed since last update.

[Ruby]効率的なループ処理

Last updated at Posted at 2018-01-26

どんな状況でもeachでループ処理を書くことは可能だけど、
適したメソッドを使えば余分なコードを書かず本質的なコードのみにすることが出来る。

結論

・ループ処理の結果を配列で返して欲しい場合はmapを使う
・ループ処理の結果をHashで返して欲しい場合はeach_with_objectを使う
・ループ処理の結果を集計したい場合はreduceを使う

各要素に加算を行い配列を返したい場合を例にする。

eachの場合

result = []
numbers = [4, 3, 9]
numbers.each do |number|
    result << number + 3
end

result

Array#map

ブロックの戻り値を集めた配列を返す。

numbers = [4, 3, 9]
numbers.map do |number|
    number + 3
end

Enumerable#each_with_object

繰り返しごとにブロック引数numberには各要素を、resultには引数objectで指定したオブジェクトを入れる。

numbers = [4, 3, 9]
numbers.each_with_object([]) do |number, result|
    result << number + 3
end

Enumerable#reduce

ブロックを使って繰り返し計算を行うのに使う。

numbers = [4, 3, 9]
numbers.reduce([]) do |result, number |
    result << number + 3
    result
end

各要素の集計を出したい場合にreduceを使うと、とてもシンプルに書くことが出来る。
eachの場合

result = 0
numbers = [4, 3, 9]
numbers.each do |number|
    result = result + number
end

result

reduceの場合

numbers = [4, 3, 9]
puts numbers.inject(:+)
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4