Help us understand the problem. What is going on with this article?

Rubyの配列のmap, eachやら簡潔に書く方法をまとめてみた。

More than 1 year has passed since last update.

rubyを簡潔に書く方法にEnumerableモジュールが存在します。
今回は、Enumerableモジュールを用いて配列を操作してみます。

map, each

各要素に対して処理を行います。
mapとeachは実行後の返り値が異なります。mapはブロック文内の返り値、eachはブロックの引数を返します。

array = [1, 2, 3]
p array.each{|item| item * 2}
# [1, 2, 3]
p array.map{|item| item * 2}
# [2, 4, 6]

inject

injectは、配列の各要素をまとめた結果を扱いたい時に使います。each、mapとは異なり初期値を設定することができます。

a = [12, 4]

p a.inject(:gcd)
# 4
p a.inject(0){|sum, i| sum + i}
# 16

lambda関数を引数として処理することもできます。

add = ->(x,y){ x + y }
p a.inject &add
# 6

select, find

ブロック内の条件式が成立する要素を検索します。
要素が存在する場合には、selectは全ての要素を返し、findは先頭の要素を返します。
要素が存在しない場合には、selectは空配列、findはnilを返します。

a = [1, 2, 3]

p a.select{|i| i % 2 == 1}
# [1, 3]
p a.select{|i| i > 3}
# []

p a.find{|i| i % 2 == 1}
# 1
p a.find{|i| i > 3}
# nil

zip, flatten

zipは二つの配列を要素番号順に結合してくれます。
flattenは配列の入れ子構造を平らにしてくれます。また、階層を指定することもできます。

a = [11, 12]
b = [21, 22]
p a.zip(b)
# [[11, 21], [12, 22]]

a = [0, [1, [2]]]
p a.flatten
# [0, 1, 2]
p a.flatten(1)
# [0, 1, [2]]

all?, any?, none?, one?

条件判定を行う時に用い、all?は全件一致、any?は一部一致、none?は一致なし、oneは一件のみ存在する場合を検索します。

a = [1, 2, 3]
p a.all?{|i| i % 2 == 1} # false
p a.any?{|i| i % 2 == 1} # true
p a.one?{|i| i % 2 == 1} # false
p a.none?{|i| i % 2 == 1} # false

a = [1, 3, 5]
p a.all?{|i| i % 2 == 1} # true
p a.any?{|i| i % 2 == 1} # true
p a.one?{|i| i % 2 == 1} # false
p a.none?{|i| i % 2 == 1} # false

a = [2, 3, 4]
p a.all?{|i| i % 2 == 1} # false
p a.any?{|i| i % 2 == 1} # true
p a.one?{|i| i % 2 == 1} # true
p a.none?{|i| i % 2 == 1} # false

参考文献

4geru
エンジニア初心者です。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away