maeshimaの日記

メモ書きです

Enumerableその1

メモ

Enumerable#cycle

object.to_a.cycle と同じ

Enumerable#drop

オブジェクトの最初の n 個を捨てた配列を返す。非破壊的。Enumerable#firstと対をなすメソッド

ary = [1, 2, 3]
ary.drop(2) #=> [3]
ary #=> [1, 2, 3]

Enumerable#drop_while

ブロック内で最初に偽となった要素よりも前の要素を捨てた配列を返す

ary = [1,2,3,4,5,6,7,8,9,10]
ary.drop_while {|item| item < 5} #=> [5, 6, 7, 8, 9, 10] 

Enumerable#each_cons

引数の要素ずつ、1要素ずつずらして取り出した各部分配列をブロックに渡す。

(1..4).each_cons(2) {|array| p array}
[1, 2]
[2, 3]
[3, 4]

Enumerable#each_with_object

injectの変化系みたいなメソッド。戻り値が限定(injectだと3行目にmemoって書いとかないと動かない)されてるおかげでinjectよりも短く書ける場合がある。破壊的に更新していかないと意図通り動かないらしいので、単純にinjectの省略形だと思ってると痛い目を見そう(hoge += "fuga"とかだと非破壊的)。Ruby1.9ActiveSupportで使える。

hash = %w(cat dog wombat).each_with_object({}) do |item, memo|
  memo[item] = item.upcase.reverse
end
hash # => {"cat"=>"TAC", "dog"=>"GOD", "wombat"=>"TABMOW"}

[ 1, 2, 3].each_with_object(0) do |i, j|
  j += i
end # => 0

Enumerable#entries

to_aの別名らしいけど使う人いるのかな

Enumerable#find_index

指定したブロックが真を返した最初の要素のインデックスを返す。「インデックスを返す」って配列以外のオブジェクト(例えばハッシュ)だとどうなるんだろうと思ったので試した。

{:hoge => :fuga}.to_a #=> [[:hoge, :fuga]] 
{:hoge => :fuga}.find_index{ |a| a == [:hoge,:fuga]}

to_aしてから比較してるみたい

Enumerable#first

引数を省略すると、最初の要素またはnilを返す。引数を指定すると、最初の n 個の要素を返す。

%w(a b c).first #=> "a" 
%w(a b c).first(2) #=> ["a", "b"]