2017-12-02 50 views
1

Rubyは、each_consと呼ばれる列挙型の便利な機能を備えています。どの「連続する要素の各配列に対して与えられたブロックを反復するか」。これは本当にいいですね。これは間違いなくeachメソッドであり、完了時にはnilを返し、ループした値の配列ではなくmapのように返します。ruby​​は、列挙可能なmap_consメソッドまたはそれに相当するメソッドをサポートしていますか?

しかし、私が列挙型を反復処理する必要がある状況では、要素とその短所をとり、その上でいくつかの操作を実行し、それらを配列に戻します。通常、この種の動作のためにマップを使用します。しかしmap_consは存在しません。

例:整数のリストを考えると

が、私はそれらの整数のものが繰り返しかを確認し、ちょうどそれらの整数

[1, 1, 4, 5, 6, 2, 2] ## I need some function that will get me [1, 2] 

のリストを返す必要が私が言うことができます:

[1, 1, 4, 5, 6, 2, 2].each_cons(2) {|e| e[0] if e[0] == e[1]} 

しかし、配列上にeachがあるため、正常に完了し、最後にnilを返します。 mapのように振る舞い、eachのようにする必要があります。

これはrubyがサポートする動作ですか?私は間違った方向からそれに完全に来ていますか?

答えて

3

each_consのドキュメントは、この無実のフレーズで終わります。「ブロックが与えられていない場合は、列挙子を返します。」 Enumerableのほとんどのメソッドはこれを行います。列挙子とは何ができますか? Nothing truly impressive。しかし、EnumeratorにはEnumerableが含まれています。Enumerableは大量の強力なメソッドを提供しますが、mapがその1つです。ステファンPochmannがないように、:

[1, 1, 4, 5, 6, 2, 2].each_cons(2).map { |e| e[0] if e[0] == e[1] } 

each_consは、ブロックなしで呼ばれるので、それは列挙子を返しています。 mapはそのメソッドの1つに過ぎません。

+0

ペアを扱っているので、 'map {| a、b | a if == b} 'となります。 –

+0

おそらく本当に印象的ではないかもしれませんが、ブロックのない列挙子はまだ手軽です。たとえば、 'enum = [:even、:odd] .cycle#=>#<列挙子:[:偶数、:奇数]:サイクル>; enum.next; #=>:偶数; enum.next#=>:odd; enum.next#=>:even' ... –

3

ちょうどmapを追加しますか?

[1, 1, 4, 5, 6, 2, 2].each_cons(2).map { |e| e[0] if e[0] == e[1] } 
=> [1, nil, nil, nil, nil, 2] 
関連する問題