在Ruby中声明一个步长不为1的整数范围

19

更新2: 为了记录,这是我采用的做法(感谢Jorg的建议):

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

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

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

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

但事实证明,我在最初的问题中并没有完全表达清楚。实际上,我想要倒着遍历这个范围。令我惊讶的是,负步长是不合法的。

(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. 是否有使用标准范围语法的某些变体实现这一点(即,(x..y).each)? 2. 无论哪种方式,用最惯用的“Ruby way”完成这个任务是什么(使用范围或其他方式)?就像我所说的,我是新手;因此,您在如何用更典型的Ruby风格完成任务方面提供的任何指导都将不胜感激。
3个回答

32

你无法使用“步长”声明一个Range。范围没有步长,它们只有开始和结束。

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

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

但是如果你只想循环迭代,那么你为什么需要首先使用 Range 呢?为什么不直接进行迭代呢?

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

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


很好,正是我所需要的——还要感谢您澄清我的术语。解决了很多问题! - Dan Tao
@Jörg,你是怎么得出最后一个语句的?步骤文档中只提到了一个参数,所以我想知道你是如何找到这个简洁解决问题的方法的。 - n_x_l
@n_x_l:我不确定你在看哪些文档,step参数已经清楚地记录了。我能找到的最旧的文档是Ruby 1.8.6的文档,而且它早在2007年就已经存在了。 - Jörg W Mittag
啊,抱歉,我看错了,应该是从范围中获取步长。谢谢! - n_x_l

5

这个问题回答了你的疑问:关于Ruby范围?

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

那么,我该如何倒过来做呢? - Dan Tao

2

我曾遇到相似的问题,以下是我找到的多种实现同一简单操作的方法。我最终选择了使用步长来完成此操作,因为它允许负数和小数增量,并且除了界限之外没有其他条件需要考虑。

  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.0公斤 - 14英石7磅

91.5公斤 - 14英石6磅

91.0公斤 - 14英石5磅

90.5公斤 - 14英石4磅

90.0公斤 - 14英石2磅

89.5公斤 - 14英石1磅

89.0公斤 - 14英石0磅

88.5公斤 - 13英石13磅

88.0公斤 - 13英石12磅


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接