【问题标题】:How do I skip the parent iteration step when the step on a nested iteration skips normally?当嵌套迭代的步骤正常跳过时,如何跳过父迭代步骤?
【发布时间】:2017-08-03 07:39:52
【问题描述】:

我有一些看起来像这样的嵌套迭代器:

line_count = 1
if commit.body.lines.each do |line|
  unless @diff_line_nums.include? line_count
     puts line
  else
     filtered_diffs.each do |diff|
         diff.body.lines.each do |line|
             puts line
         end
     end
   end
  line_count += 1
end

简单来说,这就是我当前版本中发生的情况:

a      line_count = 1
b      line_count = 2
c -    line_count = 3
   1
   2
   3
d      line_count = 4
e -    line_count = 5
   1
   2
   3
   4
   5
f      line_count = 6
g      line_count = 7
h      line_count = 8
i      line_count = 9
j      line_count = 10

但是,我想要发生的是:

a      line_count = 1
b      line_count = 2
c -    line_count = 3
   1
   2
   3
   4
h      line_count = 8
i      line_count = 9
j -    line_count = 10
   1
   2
   3
n     line_count = 14
o     line_count = 15
p     line_count = 16

Aka....当它在外部块中迭代时,一旦它进入内部迭代并成功处理每个项目,在内部的每次成功迭代中,它也应该自动增加外部块。

【问题讨论】:

    标签: ruby loops iterator


    【解决方案1】:

    您可以使用第二个变量来保存一个额外的计数器。像这样的:

    line_count = 1
    shifted_line_count = 0
    
    if commit.body.lines.each do |line|
      unless @diff_line_nums.include? line_count
         puts line + shifted_line_count
      else
         filtered_diffs.each do |diff|
             diff.body.lines.each do |line|
                 shifted_line_count += 1
                 puts line
             end
         end
       end
      line_count += 1
    end
    

    【讨论】:

    • 我想你已经到了,但我的line_count 所做的只是跟踪当前正在评估的行号。它实际上并没有修改实际正在评估的行。所以假设我们确实使用了这个新的计数器,一旦我们退出嵌套的迭代器,我将如何修改实际的迭代器(又名commit.body.lines.each)以跳到shifted_line_count
    • 我在这里假设您不想修改line_count。如果你这样做了,为什么不在内部循环中直接增加它呢?那么你就不需要辅助变量了。
    • 没有人。请记住,line_count 实际上只是一个计数器,它实际上并不影响该迭代中的本地对象。它只是跟踪它。我已经更新了问题以显示我真正想做的事情。换句话说,如果嵌套迭代在外部迭代位于c 时开始,并且嵌套集合有 3 个对象,那么当嵌套迭代在 3 步后完成时,外部迭代应该位于 g,而不是d (这将是 1 步,而不是 4 步)。那么如何修改外部迭代以跳过N 前面的位置......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2014-02-05
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    相关资源
    最近更新 更多