Hatena::Grouprubyist

Going My Ruby Way このページをアンテナに追加 RSSフィード

Ruby ロゴ (C) Ruby Association LLC

2011年07月24日(日)

知らなかった Enumerable のメソッド (その2)

| 13:46 |  知らなかった Enumerable のメソッド (その2) - Going My Ruby Way を含むブックマーク はてなブックマーク -  知らなかった Enumerable のメソッド (その2) - Going My Ruby Way  知らなかった Enumerable のメソッド (その2) - Going My Ruby Way のブックマークコメント

1.9.2 のドキュメント見てたら、知らなかった Enumerable のメソッドがありました。

メモその2。

----

each_cons - 重複ありで n 要素ずつに区切りブロックに渡す

>> (1..10).each_cons(3){|v| p v }
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]
[5, 6, 7]
[6, 7, 8]
[7, 8, 9]
[8, 9, 10]
=> nil

----

each_slice - n 要素ずつに区切りブロックに渡す

>> (1..10).each_slice(3) {|a| p a}
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[10]
=> nil

----

each_entry ... よくわからん。each との違いは以下。

class C
  include Enumerable
  def each
    yield(1,2)
  end
end

c = C.new

c.each_entry {|n| p n }  # => [1,2]
c.each       {|n| p n }  # => 1

c.each_entry {|n,| p n}  # => 1
c.each       {|n,| p n}  # => 1

c.each_entry {|_,n| p n} # => 2
c.each       {|_,n| p n} # => 2

c.each_entry {|*a| p a}  # => [[1,2]]
c.each       {|*a| p a}  # => [1,2]

ブロックが 1引数でも yeild の引数を配列で渡す、ってこと?

----

find_index - 条件に合う添字を見つける

(1..10).find_index  {|i| i % 5 == 0 and i % 7 == 0 }   #=> nil
(1..100).find_index {|i| i % 5 == 0 and i % 7 == 0 }   #=> 34

----

first - 最初の n要素の配列。結果が 1 要素の場合、値をそのまま返す。

>> [1,2,3].first
=> 1
>> [1,2,3].first(2)
=> [1, 2]

----

group_by - ブロックの評価結果をキー、対応要素の配列を値としたハッシュを返す

>> (1..6).group_by {|i| i%3}
=> {1=>[1, 4], 2=>[2, 5], 0=>[3, 6]}

----

none? - (ブロックの評価値 or 要素) がすべて偽なら真を返す

>> [].none?
=> true
>> [nil].none?
=> true
>> [nil,false].none?
=> true
>> [1,2,3].none? {|n| n > 10}
=> true
>> [true,false].none?
=> false

----

one? - (ブロックの評価値 or 要素) がひとつだけ真なら真を返す

>> [].one?
=> false
>> [nil].one?
=> false
>> [nil,false].one?
=> false
>> [1,2,3].one? {|n| n > 10}
=> false
>> [1,2,3].one? {|n| n > 2}
=> true

----

partition - ブロックの条件を満たす要素とそうでない要素の配列に分ける

>> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0].partition {|i| i % 3 == 0 }
=> [[9, 6, 3, 0], [10, 8, 7, 5, 4, 2, 1]]

----

slice_before - (ブロックの条件 or 引数のパターン)を満たす要素の前で分割する

>> e = [1,2,3,4,5].slice_before {|n| n.even? }
=> #<Enumerator: #<Enumerator::Generator:0x00000000807cf8>:each>
>> e.each {|x| p x}
[1]
[2, 3]
[4, 5]
=> nil

>> e = ["a", "b", "-", "c", "d", "-", "e"].slice_before(/^-/)
=> #<Enumerator: #<Enumerator::Generator:0x00000000819fe8>:each>
>> e.each {|x| p x}
["a", "b"]
["-", "c", "d"]
["-", "e"]
=> nil