Ruby数组each_slice_with_index是什么?

47

如果我有一个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

我知道我可以构建自己的并将其插入到数组方法中。只是想看看是否有内置函数可以做到这一点。

3个回答

99

像大多数迭代器方法一样,each_slice 从 Ruby 1.8.7+ 开始在没有块的情况下返回可枚举对象,你可以在此基础上继续调用其他枚举方法。因此,你可以这样做:

arr.each_slice(2).with_index { |(a, b), i| puts "#{i} - #{a}, #{b}" }

3
非常酷!为了解决我的原始问题,我需要执行#{i*2}操作,以获取原始数组中的索引,而不是在切片可枚举对象中的索引。 - Drew

11
arr.each_slice(2).with_index { |(*a), i| ...

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接