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リファレンス