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 回答