迭代ruby中的每两个元素循环

时间:2013-08-20 15:02:51

标签: ruby

如何创建像

这样的for循环
for (int x=0; x<data.length; x+=2) 
红宝石?我想迭代一个数组,但我的计数器增加了两个而不是一个。

4 个答案:

答案 0 :(得分:25)

如果你真正想要的是一次消耗数组中的2个项目,请查看each_slice

[1,2,3,4,5,6,7,8,9].each_slice(2) do |a, b|
  puts "#{a}, #{b}"
end

# result
1, 2
3, 4
5, 6
7, 8
9,

答案 1 :(得分:4)

Ruby的step是你的朋友:

0.step(data.length, 2).to_a
=> [0, 2, 4, 6]

我正在使用to_a来显示返回的值。在现实生活中step is an enumerator,我们就像使用它一样:

data = [0, 1, 2, 3, 4, 5]
0.step(data.length, 2).each do |i|
  puts data[i]
end

哪个输出:

0
2
4
   <== a nil 

请注意data包含六个元素,因此data.length返回6,但数组是零偏移,因此最后一个元素是元素#5。我们只得到三个值,加上一个nil,在打印时会显示为空行,这将是元素#6:

data[6]
=> nil

这就是为什么我们通常不使用Ruby中的外部迭代器来遍历数组和容器;从头到尾都太容易了。相反,使用each和类似的结构,这些结构总能做正确的事情。

要继续使用step并处理数组和容器的零偏移量,您可以使用:

0.step(data.length - 1, 2)

但我仍然尝试使用each和其他数组迭代器作为第一选择,@SergioTulentsev was giving as an example

答案 2 :(得分:1)

(0..data.length).step(2) do |x|
puts x
end

这似乎是最接近的替代品。

答案 3 :(得分:0)

使用Range#step

a = (1..50).to_a
(1..a.size).step(2).map{|i| a[i-1]} # [1, 3, 5, 7, 9 ...