LoginSignup
0
0

【Ruby】each処理を簡潔に書く

Posted at

見やすいコーディングを心がけながらコーディングをしてる矢先、
繰り返し処理の中身が簡潔なときにもっとスマートに書けないかなあ…と、
最近ふと思ったりしてたのでRubyのeach系の簡潔化をまとめてみました。

単語と示してる場所がよく一致しなくなるのでひとまずメモ

qiita.rb
配列オブジェクト.メソッド {|初期値, 要素| ブロック処理 }

そして本題

qiita.rb
# 共通変数
arr = [1, 2, 3]

.map

用途:各要素に対して処理をする
返り値:配列

qiita.rb
# .eachで書いた場合
new_arr = [];
arr.each do |i|
  new_arr << i * 10
end
qiita.rb
# .mapで書いた場合
new_arr = arr.map{|i| i * 10}

.select

用途:blockの結果がtrueである要素を全て含む配列を返す
返り値:配列

qiita.rb
# .eachで書いた場合
new_arr = [];
arr.each do |i|
  new_arr << i if i % 2 == 0
end
qiita.rb
# .selectで書いた場合
new_arr = arr.select{|i| i % 2 == 0}

.reject

用途:blockの結果がfalseである要素を全て含む配列を返す
返り値:配列

qiita.rb
# .eachで書いた場合
new_arr = [];
arr.each do |i|
  new_arr << i if i % 2 == 0
end
qiita.rb
# .rejectで書いた場合
new_arr = arr.reject{|i| i % 2 == 0}

.with_index

用途:.mapなどの処理の中でindexを使用する

qiita.rb
# .eachで書いた場合
new_arr = [];
arr.each_with_index do |v, k|
  new_arr << v * k
end
qiita.rb
# .with_indexで書いた場合
new_arr = arr.map.with_index{|v, k| v * k}

.flatten

用途:配列の入れ子を平坦化する

qiita.rb
# .flattenで書いた場合
flatten_arr = [1, 2, [3]]
new_arr = flatten_arr.flatten

.inject

用途:各要素をまとめた結果を返す
返り値:要素の型によって変わる

qiita.rb
result = arr.inject{|sum, i| sum + i}
# 1回目の処理: i = 1, sum = 2 ⇒ 3
# 2回目の処理: i = 2, sum = 3 ⇒ 5
# 3回目の処理: i = 3, sum = 3 ⇒ 6
# result = 6

初期値を設定することもできる

qiita.rb
result = arr.inject(4){|sum, i| sum + i}
# 1回目の処理: i = 4, sum = 1 ⇒ 5
# 2回目の処理: i = 5, sum = 2 ⇒ 7
# 3回目の処理: i = 7, sum = 3 ⇒ 10
# result = 10

初期値を省略した場合は、
配列の先頭の値が渡され2つ目の要素から処理を実行。
参考1:https://uxmilk.jp/25932
参考2:https://www.sejuku.net/blog/19219#index_id1

配列を単純に加算するだけなら

qiita.rb
result = arr.inject(:+)
result = arr.inject(1, :+)

という書き方ができる。

文字列の結合も可。

qiita.rb
strs = ["a", "b", "c"]
result = strs.inject("", :<<)
# result = "abc"

でも文字列の連結は.joinでできるし、
数字の合計を求めるときに使うくらい?
いまいち.injectの使い方がピンとこない…

0
0
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
0
0