46

もし私が持っているなら、私arr = [1, 2, 3, 4]は次のことができることを知っています...

> arr.each_slice(2) { |a, b| puts "#{a}, #{b}" }
1, 2
3, 4

...と...

> arr.each_with_index { |x, i| puts "#{i} - #{x}" }
0 - 1
1 - 2
2 - 3
3 - 4

...しかし、これを行うための組み込みの方法はありますか?

> arr.each_slice_with_index(2) { |i, a, b| puts "#{i} - #{a}, #{b}" }
0 - 1, 2
2 - 3, 4

私は自分自身を構築し、それを配列メソッドに貼り付けることができることを知っています. これを行うための組み込み関数があるかどうかを確認するだけです。

4

3 に答える 3

96

ほとんどのイテレータ メソッドと同様にeach_slice、Ruby 1.8.7 以降では、ブロックなしで呼び出されたときに列挙可能なメソッドを返します。これにより、さらに列挙可能なメソッドを呼び出すことができます。したがって、次のことができます。

arr.each_slice(2).with_index { |(a, b), i| puts "#{i} - #{a}, #{b}" }
于 2011-05-12T20:29:16.287 に答える
11
arr.each_slice(2).with_index { |(*a), i| ...

また、ブロックの最初のパラメーターである配列は、*arr にすることができることに注意してください。

于 2012-02-13T21:02:00.910 に答える
6

1.9 では、ブロックが提供されていない場合、多くのメソッドが列挙子を返します。列挙子で別のメソッドを呼び出すことができます。

arr = [1, 2, 3, 4, 5, 6, 7, 8] 
arr.each_with_index.each_slice(2){|(a,i), (b,j)| puts "#{i} - #{a}, #{b}"}

(@sepp2k のバリエーション)。結果:

0 - 1, 2
2 - 3, 4
4 - 5, 6
6 - 7, 8
于 2011-05-12T20:43:00.943 に答える