在Ruby中使用step!= 1声明一个整数范围

Dan*_*Tao 15 ruby range

更新2:对于子孙后代,我就这样做了(感谢Jorg的输入):

100.step(2, -2) do |x|
    # my code
end
Run Code Online (Sandbox Code Playgroud)

(显然有很多方法可以做到这一点;但听起来这是最"Ruby"的方式;而这正是我所追求的.)


更新:好的,所以我要找的是step:

(2..100).step(2) do |x|
    # my code
end
Run Code Online (Sandbox Code Playgroud)

但事实证明,在我原来的问题中,我并非100%即将到来.我实际上想要向后迭代这个范围.令我惊讶的是,消极的一步是不合法的.

(100..2).step(-2) do |x|
    # ArgumentError: step can't be negative
end
Run Code Online (Sandbox Code Playgroud)

那么:我该怎么做呢?


嘿伙计们,我对Ruby 很,所以要温柔.

假设我想迭代从2到100的偶数范围; 我该怎么办?

显然我可以这样做:

(2..100).each do |x|
    if x % 2 == 0
        # my code
    end
end
Run Code Online (Sandbox Code Playgroud)

但是,显然(再次),这将是非常愚蠢的.

我知道我可以这样做:

i = 2
while i <= 100
    # my code
    i += 2
end
Run Code Online (Sandbox Code Playgroud)

我相信我也可以编写自己的自定义类,提供自己的each方法(?).不过,我几乎可以肯定这会有点矫枉过正.

我对两件事感兴趣:

  1. 是否可以使用标准Range语法的某些变体(即(x..y).each)进行此操作?
  2. 无论哪种方式,实现这一点的最惯用的"Ruby方式"是什么(使用Range或其他方式)?就像我说的,我是语言的新手; 因此,您可以提供有关如何以更典型的Ruby风格进行操作的任何指导.

Jör*_*tag 24

你不能Range用"步骤" 声明一个.范围没有步骤,只是有一个开始和结束.

你当然可以遍历Range的步骤,例如像这样:

(2..100).step(2).reverse_each(&method(:p))
Run Code Online (Sandbox Code Playgroud)

但如果你想要的只是迭代,那么你首先需要的Range是什么呢?为什么不迭代?

100.step(2, -2, &method(:p))
Run Code Online (Sandbox Code Playgroud)

这具有额外的好处,不像reverse_each它不需要生成中间数组.


zil*_*n01 5

这个问题回答了您的问题:关于红宝石范围?

(2..100).step(2) do |x|
    # your code
end
Run Code Online (Sandbox Code Playgroud)