見やすいコーディングを心がけながらコーディングをしてる矢先、
繰り返し処理の中身が簡潔なときにもっとスマートに書けないかなあ…と、
最近ふと思ったりしてたので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
の使い方がピンとこない…