我可以这样迭代
(0..10).step(2){|v| puts v}
但是,由于反转范围等于空范围,我无法以这种方式迭代
(10..0).step(2){|v| puts v}
它不会给我任何收获。当然,我可以像这样向后迭代
10.downto(0){|v| puts v}
但是downto方法不允许我设置除默认值1之外的其他步骤。 这是一个非常基本的东西,所以我想应该有一个内置的方法来做到这一点,我不知道。
答案 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