【问题标题】:Declaring an integer Range with step != 1 in Ruby在 Ruby 中使用 step != 1 声明整数范围
【发布时间】:2011-03-03 01:38:31
【问题描述】:

更新 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 风格做事提供任何指导,我们将不胜感激。

【问题讨论】:

    标签: ruby range


    【解决方案1】:

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

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

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

    但是,如果您只想进行迭代,那么您首先需要 Range 做什么?为什么不只是迭代?

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

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

    【讨论】:

    • 不错。正是我需要的——也感谢你澄清我的术语。清理了很多!
    • @Jörg 知道你最后的陈述是如何结束的吗? step 的文档只提到了一个论点,所以我想知道您是如何以简洁的方式解决这个问题的。
    • @n_x_l:我不确定你在看什么文档,step 参数是clearly documented。我能找到的最古老的文档是 Ruby 1.8.6 的文档,它是 2007 年的 was already there
    • 啊抱歉,我正在查看距离范围内的步数。 :) 非常感谢。
    【解决方案2】:

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

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

    【讨论】:

    • 那么,我该怎么做呢?
    【解决方案3】:

    我在这里遇到了类似的问题,我发现有多种方法可以完成我最后使用的步骤,因为它允许 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.5 公斤 - 14 磅 6 磅

    91.0kg - 14st 5lbs

    90.5 公斤 - 14 磅 4 磅

    90.0kg - 14st 2lbs

    89.5 公斤 - 14 磅 1 磅

    89.0kg - 14st 0lbs

    88.5 公斤 - 13 磅 13 磅

    88.0kg - 13st 12lbs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      相关资源
      最近更新 更多