Hyurakuのエンジニア日誌

SE出身Webエンジニアのブログ

知っておきたいRubyのarrayメソッド6つ #15

Rubyでarrayを扱うときに、Six Ruby array methods you need to know という記事を読んだ。紹介されたメソッドの中にはあまり使っていないのがあったので、 備忘録がてらまとめてみた。

1. Map/Each

mapとeach、やっていることは同じだが次の違いがある。 - map: 新たにオブジェクトを生成している。 - each: 既存のオブジェクトを参照している。

array = [1, 2, 3]
effects = array.each{|x| # create record from x }
> [1,2,3]
added = array.map{ |x| x + 2 }
> [3,4,5]

array.object_id
> 70287991433000
effects.object_id
> 70287991433000
added.object_id
> 70287996325680

2. Select

このメソッドは条件に当てはまる要素を抽出するメソッドである。

array = [1, 2, 3]
array.select{ |x| x%2==0 }
> [2]

次のようにMapと組み合わせ使うこともできる。

Level = ['Easy','Middle','Hard']
Test_list = [{
  subject: 'language',
  level: 'Middle'
  }, {
  subject: 'Math',
  level: 'Very Hard'
  }, {
  subject: 'Science',
  level: 'Easy'
  }]

Test_list.select{ |test| Level.include?(test[:level])}.map{ |test| test[:subject]}
> ["language", "Science"]

3. Reject

selectとは逆の作用をするメソッド。

Test_list.reject{ |test| Level.include?(test[:level])}.map{ |test| test[:subject]}
> ["Math"]

4. Reduce

arrayの各要素に同じ処理を行うメソッド。 また引数を指定して処理を行うことができる。

array = [1, 2, 3, 4]
array.reduce{|sum, x| sum + x}
# 1 + 2 + 3 + 4
> 10
array.reduce(20) {|num, n| num - n }
> 10

5. Join

配列の各要素を連結した文字列を返すメソッド。

Test_list.map{ |test| test[:subject]}.join(',')
> "language,Math,Science"

ちなみに元記事では紹介されたすべてのメソッドを使用したコードが書かれている。 実際に動かしてみるのもよいでしょう。

days = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
days.map{|day| day.odd? ? 
   {task: 'dishes', minutes: Random.rand(20)} : 
   {task: 'sweep', minutes: Random.rand(20)}}
   .select{|task| task[:minutes] < 15}
   .reject{|task| task[:minutes] < 5}
   .reduce(0){|sum, task| sum + task[:minutes]}