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

Tsv*_*nin 10 ruby

你如何创建一个for循环

for (int x=0; x<data.length; x+=2) 
Run Code Online (Sandbox Code Playgroud)

在红宝石?我想迭代一个数组,但我的计数器增加了两个而不是一个.

Joh*_*ter 27

如果您真正想要的是一次从数组中使用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,
Run Code Online (Sandbox Code Playgroud)

  • 在传入参数列表中处理单个不需要的变量的Ruby方法是使用`_`黑洞.在其他语言中,如Perl,它通常用作临时变量,而Ruby*也可以*这样做,但我们不这样做,因为它令人困惑.对于诸如`| a,_ |`之类的东西,它确实非常方便,然后从那里忽略它.使用更新的Rubies来实现它的一个更被接受的方法是`| a,*|`它将吞噬多个值. (2认同)

the*_*Man 6

Rubystep是你的朋友:

0.step(data.length, 2).to_a
=> [0, 2, 4, 6]
Run Code Online (Sandbox Code Playgroud)

to_a用来显示这将返回什么值。在现实生活中step是一个 enumerator,所以我们会像这样使用它:

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

哪些输出:

0
2
4
   <== a nil 
Run Code Online (Sandbox Code Playgroud)

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

data[6]
=> nil
Run Code Online (Sandbox Code Playgroud)

这就是为什么我们通常不在 Ruby 中使用外部迭代器遍历数组和容器的原因;最后太容易掉线了。相反,使用each和类似的结构,它们总是做正确的事情。

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

0.step(data.length - 1, 2)
Run Code Online (Sandbox Code Playgroud)

但我仍然会尝试使用each和其他数组迭代器作为第一选择,@SergioTulentsev 以@SergioTulentsev 为例