Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 当嵌套迭代上的步骤正常跳过时,如何跳过父迭代步骤?_Ruby_Loops_Iterator - Fatal编程技术网

Ruby 当嵌套迭代上的步骤正常跳过时,如何跳过父迭代步骤?

Ruby 当嵌套迭代上的步骤正常跳过时,如何跳过父迭代步骤?,ruby,loops,iterator,Ruby,Loops,Iterator,我有一些嵌套迭代器,如下所示: 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

我有一些嵌套迭代器,如下所示:

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
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
简单来说,这就是我当前版本中的情况:

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…当它在外部块中迭代时,一旦进入内部迭代并成功处理每个项目,在内部块的每次成功迭代中,它也应该自动递增外部块。

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

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
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

我想你已经到了,但是我的
行数所做的就是跟踪当前正在评估的行号。它实际上并没有修改实际正在计算的行。假设我们使用了这个新的计数器,那么一旦我们从嵌套的迭代器中出来,我将如何修改实际的迭代器(aka
commit.body.lines.each
)以跳到
shift\u line\u count
。如果这样做,为什么不在内部循环中直接增加它呢?那你就不需要第二个变量了。请记住,
line\u count
实际上只是一个计数器,它实际上并不影响迭代中的本地对象。它只是跟踪它。我已经更新了问题,以显示我真正想做什么。换句话说,如果嵌套迭代在外部迭代位于
c
时开始,并且嵌套集合有3个对象,那么当嵌套迭代在3个步骤之后完成时,外部迭代应该位于
g
,而不是
d
(这将是1个步骤,而不是4个步骤)。那么,如何修改外部迭代以跳过前面的
N
位置。。。。