Hatena::Grouprubyist

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

Ruby ロゴ (C) Ruby Association LLC

2011年07月24日(日)

知らなかった Enumerable のメソッド

| 10:38 |  知らなかった Enumerable のメソッド - Going My Ruby Way を含むブックマーク はてなブックマーク -  知らなかった Enumerable のメソッド - Going My Ruby Way  知らなかった Enumerable のメソッド - Going My Ruby Way のブックマークコメント

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

メモメモ。

----

cycle - 要素を無限に繰り替えす

>> [1,2,3,4].zip([:px].cycle).map {|n,unit| "#{n}#{unit}"}
=> ["1px", "2px", "3px", "4px"]

>> [1,2,3].cycle {|n| p n}
1
2
3
1
2
3
:   # 無限に...

chunk - チャンクを要素とする enumrator を返す。(難しい。。。)

>> e = [1,2,3].chunk {|n| "#{n}px" }
=> #<Enumerator: #<Enumerator::Generator:0x00000000c05850>:each>
>> e.each {|x| p x }
["1px", [1]]
["2px", [2]]
["3px", [3]]
=> nil

>> e = [1,2,3].chunk {|n| p n }    # p n するブロックを与える
=> #<Enumerator: #<Enumerator::Generator:0x0000000082a050>:each>
>> e.each {|n| n }                 # この時点でブロック実行 
1
2
3
=> nil

>> base = 100
=> 100
>> e = [1,2,3].chunk {|n| n * base }
=> #<Enumerator: #<Enumerator::Generator:0x00000000bd9818>:each>
>> e.each {|n| p n }
[100, [1]]
[200, [2]]
[300, [3]]
=> nil
>> base = 200
=> 200
>> e.each {|n| p n }   # クロージャー
[200, [1]]
[400, [2]]
[600, [3]]
=> nil

>> e = [1,2,3].chunk(state=[]) {|n, memo| n * base }
...
# memo は state を dup したもの。
# (dup できない Numeric などは state で渡せない)

とりあえず、チャンクは res = ブロックの評価結果 と data = 元のデータの、

  [res, [data]]

Array という解釈でいいのだろうか。

で、ブロックの評価は enumerator の each(など) が呼ばれた時点で行なわれる(遅延評価)。

----

flat_map

>> [[1,2],[3,4]].flatten(1).map {|i| i }   #=> [1, 2, 3, 4]
=> [1, 2, 3, 4]

この例では、

[[1,2],[3,4]].flatten.map {|i| i }

と同じ。flat_map の存在意義は?

----

count

引数やブロックを指定できたらしい。

>> a = [1, 2, 4, 2]
=> [1, 2, 4, 2]
>> a.count
=> 4
>> a.count(2)
=> 2
>> a.count{|x| x.even?}
=> 3

----

drop - 最初の n 要素を捨て、残りを配列として返す

>> [1,2,3,4].drop(1)       # cdr な感じ
=> [2, 3, 4]

drop_while


>> [1,2,3,4].drop_while {|n| n < 3}
=> [3, 4]
>> [1,2,3,4].drop_while {|n| n > 3}
=> [1, 2, 3, 4]

>> e = [1,2,3,4].drop_while
=> #<Enumerator: [1, 2, 3, 4]:drop_while>
>> e.each {|n| n < 3}
=> [3, 4]

----

take - 最初の n 要素を配列として返す

>> [1,2,3,4].take(2)
=> [1, 2]
----

take_while

>> [1,2,3,4].take_while {|n| n < 3}
=> [1, 2]
>> [1,2,3,4].take_while {|n| n > 3}
=> []
>> e = [1,2,3,4].take_while
=> #<Enumerator: [1, 2, 3, 4]:take_while>
>> e.each {|n| n < 3}
=> [1, 2]

まだありますが、とりあえずここまで。

---------------------

chunk を試してる時ハマったところ。 p の返り値が 1.9 で変更されてました。

ruby1.8.7

>> p 10
10
=> nil

ruby1.9.2

>> p 10
10
=> 10