14

你如何创建一个像这样的for循环

for (int x=0; x<data.length; x+=2) 

在红宝石中?我想遍历一个数组,但让我的计数器增加 2 而不是 1。

4

4 回答 4

40

如果您真正想要的是一次从一个数组中消耗 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,
于 2013-08-20T15:05:19.727 回答
6

Ruby'sstep是你的朋友:

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

to_a用来显示这将返回什么值。在现实生活中step是一个 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 以它为例

于 2013-08-20T15:23:50.283 回答
1
(0..data.length).step(2) do |x|
puts x
end

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

于 2013-08-20T20:48:12.467 回答
0

使用Range#step

a = (1..50).to_a
(1..a.size).step(2).map{|i| a[i-1]} # [1, 3, 5, 7, 9 ...
于 2013-08-20T15:19:22.960 回答