Ruby数组each_slice_with_index?

Dre*_*rew 43 ruby iteration built-in

如果我arr = [1, 2, 3, 4]知道我可以做以下事情......

> arr.each_slice(2) { |a, b| puts "#{a}, #{b}" }
1, 2
3, 4
Run Code Online (Sandbox Code Playgroud)

...和...

> arr.each_with_index { |x, i| puts "#{i} - #{x}" }
0 - 1
1 - 2
2 - 3
3 - 4
Run Code Online (Sandbox Code Playgroud)

......但是有没有内置的方法来做到这一点?

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

我知道我可以构建自己的并将其粘贴到数组方法中.只是想看看是否有内置功能来做到这一点.

sep*_*p2k 87

像大多数迭代器方法一样,each_slice从ruby 1.8.7+开始,在没有块的情况下调用时返回一个可枚举,然后可以调用其他可枚举方法.所以你可以这样做:

arr.each_slice(2).with_index { |(a, b), i| puts "#{i} - #{a}, #{b}" }
Run Code Online (Sandbox Code Playgroud)

  • 很酷!只是为了完成我的原始问题,我需要做#{i*2}来获取原始arr中的索引而不是切片枚举中的索引. (3认同)

mek*_*tal 11

arr.each_slice(2).with_index { |(*a), i| ...
Run Code Online (Sandbox Code Playgroud)

还要注意,数组,块的第一个参数,可以是*arr


ste*_*lag 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}"}
Run Code Online (Sandbox Code Playgroud)

(@ sepp2k的变化).结果:

0 - 1, 2
2 - 3, 4
4 - 5, 6
6 - 7, 8
Run Code Online (Sandbox Code Playgroud)