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

时间:2010-06-12 19:06:10

标签: ruby range

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

100.step(2, -2) do |x|
    # my code
end

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


更新:好的,我正在寻找的是step

(2..100).step(2) do |x|
    # my code
end

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

(100..2).step(-2) do |x|
    # ArgumentError: step can't be negative
end

所以:如何向后执行此操作?


嘿伙计们,我对Ruby非常全新,所以要温柔。

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

显然我可以做:

(2..100).each do |x|
    if x % 2 == 0
        # my code
    end
end

但是,显然(再次),那将是非常愚蠢的。

我知道我可以这样做:

i = 2
while i <= 100
    # my code
    i += 2
end

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

我对两件事感兴趣:

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

3 个答案:

答案 0 :(得分:23)

您无法使用“步骤”声明Range。范围没有步骤,只是有一个开始和结束。

您当然可以在Range上逐步迭代,例如:

(2..100).step(2).reverse_each(&method(:p))

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

100.step(2, -2, &method(:p))

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

答案 1 :(得分:3)

这个问题可以回答你的问题:about ruby range?

(2..100).step(2) do |x|
    # your code
end

答案 2 :(得分:1)

我在这里有类似的问题是我发现的各种方法做同样的简单事情我最后用的步骤因为它允许NEGATIVE和FRACTIONAL增量而且我没有条件,除了寻找的边界

  case loop_type

    when FOR
      # doen't appear to have a negative or larger than 1 step size!
      for kg in 50..120 do
        kg_to_stones_lbs(kg)
      end

    when STEP
      120.step(70,-0.5){ |kg|
        kg_to_stones_lbs(kg)
      }

    when UPTO
      50.upto(120) { |kg|
        kg_to_stones_lbs(kg)
      }

    when DOWNTO
      120.downto(50){ |kg|
        kg_to_stones_lbs(kg)
      }

    when RANGE
      (50..120).reverse_each{ |kg|
        kg_to_stones_lbs(kg)
      }

    when WHILE
      kg = 120
      while kg >= 50
        kg_to_stones_lbs(kg)
        kg -= 0.5
      end
  end

O / P:

92.0kg - 14st 7lbs

91.5kg - 14st 6lbs

91.0kg - 14st 5lbs

90.5kg - 14st 4lbs

90.0kg - 14st 2lbs

89.5kg - 14st 1lbs

89.0kg - 14st 0lbs

88.5kg - 13st 13lbs

88.0kg - 13st 12lbs