LoginSignup
40
37

More than 5 years have passed since last update.

Ruby力を高めるためには標準メソッドを学べ(Enumerable編)

Last updated at Posted at 2015-12-01

Rubyを使っていて、便利だなって思うのが配列の操作についてなのですが、
コードレビューをしていて、
標準メソッドを使いこなしていると結構Rubyっぽいコードになって、イケてるなーって思ったりします。
覚えておくと覚えると便利なので、覚えていきましょう。

drop

[*1..5].drop 2

出力結果

[3, 4, 5]

cycle

  • 配列のループを引数の数だけ繰り返す
    ※ 引数を指定しない場合はbreakしない限り、無限にループさせる

実行プログラム

arr = [1, 2, 3, 4, 5]
arr.cycle(2) {|item| print "#{item} " }
1 2 3 4 5 1 2 3 4 5

出力結果

1 2 3 4 5 1 2 3 4 5

find

  • 要素を探して条件に合うものを取得
puts [38, 74, 56, 48, 87, 68, 81, 49].find {|item| item % 7 == 0 }

出力結果

56

all?

  • 全て真かどうかの検証を行う。
puts ['a', 'b', 'c'].all? {|w| w.kind_of?(String) }
puts ['a', 'b', 3].all? {|w| w.kind_of?(String) }
puts [1, 2, 3].false? {|w| w.kind_of?(String) }

出力結果

true
false
false

any?

  • どれか真であるかを調べる(真のものを見つかった時点で実行終了)
puts ['a', 'b', 'c'].any? {|w| w.kind_of?(String) }
puts ['a', 'b', 3].any? {|w| w.kind_of?(String) }
puts [1, 2, 3].any? {|w| w.kind_of?(String) }

出力結果

true
true
false

none?

  • 全て偽であるかを調べる
puts ['a', 'b', 'c'].none? {|w| w.kind_of?(String) }
puts ['a', 'b', 3].none? {|w| w.kind_of?(String) }
puts [1, 2, 3].none? {|w| w.kind_of?(String) }

出力結果

false
false
true

one?

  • 一つだけ真であるかどうかを調べる
puts ['a', 'b', 'c'].one? {|w| w.kind_of?(String) }
puts ['a', 'b', 3].one? {|w| w.kind_of?(String) }
puts [1, 2, 3].one? {|w| w.kind_of?(String) }
puts ['a', 'b', 3].one? {|w| w.kind_of?(Integer) }

出力結果

false
false
false
true

flat_map

  • 入れ子の配列をmapしてflattenしてくれる
p [[1,2],[3,4]].map { |i| i }
p [[1,2],[3,4]].flat_map { |i| i }

出力結果

[[1, 2], [3, 4]]
[1, 2, 3, 4]

reduce

  • ブロックを使って繰り返し計算を行うのに使う。
  • 以下の例は配列に入っている数値の合計値を出力している。
puts [2, 6, 5, 3, 7, 8, 1, 9, 4].reduce {|sum, n| sum + n }
45

lazy

このメソッドは「map や select などの lazy 版を提供するためのメソッド」です。ただ、正確にいうと「map や select などの lazy 版を提供するための名前空間を提供するメソッド」となります。

※最初は浅い理解から入っていいと思いますが、徐々に深く理解していきましょう。

以下のプログラムを実行したらどんな値が返ってくると思いますか?

[*1..100].cycle.select{|_| 1 == 1}.first

結果はなにも返ってこないです。
[*1..100].cycleが無限のリストを作るメソッドなので、結果、
無限ループをしてしまい、ただCPUとメモリを使うだけのプログラムと
なります。

では以下のプログラムならどうでしょう?

puts [*1..100].cycle.lazy.select{|_| 1 == 1}.first

実行結果として1が返ってきます。

1

詳しくは参考記事を載せたので、見ましょう!

arr.cycle.lazy.drop(rand 100).first

書いてて力尽きたもの

  • chunk
  • each_entry
  • entries
  • partition
  • slice_before
  • sort_by
  • take
  • zip

最後に

  • Array、Hashあたりを次に書いていこうと思います。

参考記事

Ruby - EnumeratorとEnumerator::Lazyの違い - Qiita
Rubyist Magazine - 無限リストを map 可能にする Enumerable#lazy
Enumerable - Rubyリファレンス

40
37
2

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
40
37