【问题标题】:Ruby: How to iterate over a range, but in set increments?Ruby:如何迭代一个范围,但以设定的增量?
【发布时间】:2011-05-19 18:45:16
【问题描述】:

所以我正在像这样迭代一个范围:

(1..100).each do |n|
    # n = 1
    # n = 2
    # n = 3
    # n = 4
    # n = 5
end

但我想做的是迭代 10 次。

所以不是将n 增加 1,而是下一个 n 实际上是 10,然后是 20、30 等等。

【问题讨论】:

标签: ruby iterator increment


【解决方案1】:

这是另一种可能看起来更熟悉的方法:

for i in (0..10).step(2) do
    puts i
end

【讨论】:

  • 抱歉,Ruby 风格指南强烈反对使用 for 循环。
  • @DarthEgregious 为什么会这样?
  • 每一个事物都是一个对象,每一个动作都是一个方法调用,这是哲学的延伸。因此,您应该使用each 方法,而不是使用for 的内置for 循环。
【解决方案2】:

您可以使用Numeric#step

0.step(30,5) do |num|
  puts "number is #{num}"
end
# >> number is 0
# >> number is 5
# >> number is 10
# >> number is 15
# >> number is 20
# >> number is 25
# >> number is 30

【讨论】:

    【解决方案3】:
    rng.step(n=1) {| obj | block } => rng
    

    遍历 rng,将每个第 n 个元素传递给块。如果范围包含数字或字符串,则使用自然排序。否则 step 调用 succ 来遍历范围元素。以下代码使用类 Xs,在类级文档中定义。

    range = Xs.new(1)..Xs.new(10)
    range.step(2) {|x| puts x}
    range.step(3) {|x| puts x}
    

    产生:

    1 x
    3 xxx
    5 xxxxx
    7 xxxxxxx
    9 xxxxxxxxx
    1 x
    4 xxxx
    7 xxxxxxx
    10 xxxxxxxxxx
    

    参考:http://ruby-doc.org/core/classes/Range.html

    ......

    【讨论】:

      【解决方案4】:

      有关完整 API,请参阅 http://ruby-doc.org/core/classes/Range.html#M000695

      基本上你使用step() 方法。例如:

      (10..100).step(10) do |n|
          # n = 10
          # n = 20
          # n = 30
          # ...
      end
      

      【讨论】:

      • 这个答案让我找到了我正在寻找的东西......如果你有两次,你可以做(time1..time2).step(15.minutes) do |time|
      猜你喜欢
      • 2013-08-26
      • 2015-10-27
      • 2017-06-06
      • 2011-01-28
      • 2012-11-09
      • 2013-03-20
      • 2014-09-08
      • 1970-01-01
      • 2021-08-06
      相关资源
      最近更新 更多