如何通过Ruby中的特定步骤迭代反转范围?

时间:2013-03-30 06:01:59

标签: ruby iteration range

我可以这样迭代

(0..10).step(2){|v| puts v}

但是,由于反转范围等于空范围,我无法以这种方式迭代

(10..0).step(2){|v| puts v}
它不会给我任何收获。当然,我可以像这样向后迭代

10.downto(0){|v| puts v}

但是downto方法不允许我设置除默认值1之外的其他步骤。 这是一个非常基本的东西,所以我想应该有一个内置的方法来做到这一点,我不知道。

3 个答案:

答案 0 :(得分:22)

为什么不使用Numeric#step

来自文档:

  

使用从num开始的数字序列调用block,在每次调用时按步长(默认值1)递增。当要传递给块的值大于限制(如果步为正)或小于限制(如果步为负)时,循环结束。如果所有参数都是整数,则循环使用整数计数器进行操作。如果任何参数是浮点数,则所有参数都转换为浮点数,并且循环执行floor(n + n * epsilon)+ 1次,其中n =(limit - num)/ step。否则,循环从num开始,使用<或者>运算符将计数器与限制进行比较,并使用+运算符递增自身。

irb(main):001:0> 10.step(0, -2) { |i| puts i }
10
8
6
4
2
0

答案 1 :(得分:4)

通过跳过您不需要的值来模拟step非常容易。像这样:

10.downto(0).each_with_index do |x, idx|
  next if idx % 3 != 0 # every third element
  puts x
end
# >> 10
# >> 7
# >> 4
# >> 1

答案 2 :(得分:0)

10.step(0, -2) do |v| puts "#{v}" end




10
8
6
4
2
0