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

更新2 :对于子孙后代,这就是我如何做到这一点(感谢Jorg的输入):

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

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


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

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

但事实certificate,在我原来的问题中,我并非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风格进行操作的任何指导,我们将非常感激。

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

您当然可以逐步遍历 Range ,例如:

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

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

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

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

这个问题回答你的问题: 关于ruby系列?

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

我有类似的问题,这里有各种各样的方法,我发现做同样的简单的事情,我最后使用的步骤,因为它允许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.5千克–14磅4磅

90.0kg – 14st 2lbs

89.5千克–14磅1磅

89.0kg – 14st 0lbs

88.5kg – 13st 13lbs

88.0kg – 13st 12lbs