【问题标题】:For loop with conditional increment带条件增量的 For 循环
【发布时间】:2016-02-17 17:07:52
【问题描述】:

我想要一个根据条件递增的for 循环。循环通常应将其索引i 增加1,但如果满足某些条件(i == 20),则应将i 的值设置为50(跳过21--@987654328 @)。伪代码是这样的:

for(i = 0; i < 100;)
  if i == 20
    i = 50
  else
    i = i++
  end 
end

我该如何实现?

【问题讨论】:

  • Ruby 没有:++ 方法,您不需要第一行中的第二个分号。

标签: ruby loops


【解决方案1】:

这可能是适合使用while 循环的少数情况之一:

i = 0
while i < 10
  if i == 2
    i = 5
  else
    i += 1
  end

  p i
end
# 1
# 2
# 5
# 6
# 7
# 8
# 9
# 10

或者,您可以将自己的 C 风格 for 循环添加到语言中,这实际上非常简单:

class Proc
  def for(iter=->{}, &blk)
    return unless call
    yield
    iter.()
    self.for(iter, &blk)
  end
end

i = 0
-> { i < 10 }.for -> { if i == 2 then i = 5 else i += 1 end } { p i }
# 1
# 2
# 5
# 6
# 7
# 8
# 9
# 10

这等效于以下 C 风格的 for 循环(在 ECMAScript 中演示):

for(let i = 1; i <= 10; i === 2 ? i = 5 : i++) {
  console.log(i);
}
// 1
// 2
// 5
// 6
// 7
// 8
// 9
// 10

【讨论】:

    【解决方案2】:

    由于您需要根据递增的i 变量重新评估条件,您可以使用while 语句:

    i = 0
    
    while i < 100  do
      if i == 20
         i = 50
      else
         i = i+1
      end 
    end
    

    【讨论】:

      【解决方案3】:

      不知道你想把那里的数字写得多么真实,但这里有一个更优雅的技巧:

      [0...20, 50..100].flat_map(&:to_a).each do |i|
        # ...
      end
      

      [*0...20, *50..100].each do |i|
        # ...
      end
      

      【讨论】:

      • @CarySwoveland 谢谢,将添加。
      【解决方案4】:

      我不推荐这样做,但这是在使用带有块的枚举器时跳过索引的一种方法。假设

      skip_index  = 2
      skip_number = 4
      arr = [*0..10]
      

      然后:

      arr = arr[skip_number..10] if skip_index.zero?
      arr.each do |i|
        puts "i=#{i}"
        # do something
        arr.replace([*skip_number..10]) if i == skip_index-1
      end
      i=0
      i=1
      i=6
      i=7
      i=8
      i=9
      i=10
      

      这可以让您深入了解each 的工作原理。

      【讨论】:

        【解决方案5】:

        这是一个简洁的while循环,可以实现你想要做的事情。

        i = 0
        while i < 100
            i == 20 ? i = 50 : i += 1
            p i
        end
        

        这将返回: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 50 51 52 53 ... 100

        【讨论】:

          猜你喜欢
          • 2021-02-16
          • 1970-01-01
          • 2016-09-07
          • 1970-01-01
          • 2014-07-29
          • 2019-06-25
          • 2021-07-06
          • 1970-01-01
          • 2017-03-22
          相关资源
          最近更新 更多