代码之家  ›  专栏  ›  技术社区  ›  Dan Tao

用step声明整数范围!=红宝石中的1

  •  14
  • Dan Tao  · 技术社区  · 15 年前

    更新2 :对于子孙后代来说,这就是我决定做这件事的方式(多亏了Jorg的投入):

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

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


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

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

    但事实证明,在我最初的问题中,我并不是百分之百地愿意回答。我实际上想向后迭代这个范围。令我惊讶的是,消极的一步是不合法的。

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

    所以: 我该怎么做呢?


    嘿,伙计们,我是 全新 对红宝石,所以要温柔。

    假设我想在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方式”是什么?如我所说,我对该语言还不熟悉;因此,对于如何以更典型的Ruby风格进行操作,您可以提供任何指导,我们将不胜感激。
    3 回复  |  直到 12 年前
        1
  •  23
  •   Jörg W Mittag    15 年前

    你不能申报 Range 用“台阶”。范围没有步骤,它们只是有开始和结束。

    你当然可以 迭代 过了 范围 例如,在以下步骤中:

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

    但是如果你只想迭代,那么你需要什么 范围 因为首先?为什么不重复?

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

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

        2
  •  3
  •   Community CDub    8 年前

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

    (2..100).step(2) do |x|
        # your code
    end
    
        3
  •  1
  •   Martin Vidner    12 年前

    我在这里也遇到了类似的问题,我发现了各种方法来做同样的简单的事情,我在最后使用了step,因为它允许负增量和分数增量,而我没有条件,除了要查找的边界之外。

      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磅

    90.0千克-14升2磅

    89.5千克-14磅

    89.0千克-14升

    88.5公斤-13磅

    88.0千克-13第12磅

    推荐文章