Ruby 如何在迭代数组时修改迭代器

Ruby 如何在迭代数组时修改迭代器,ruby,loops,iterator,Ruby,Loops,Iterator,我想根据运行时确定的条件跳过循环x次。我该怎么做 for i in (0..5) if i==0 3.times {next} # i=i+3 also doesnt work end puts i end 预期产出 3 4 5 编辑: 为了澄清,问题是条件(即i==0)和跳过x的迭代次数都是在运行时动态确定的,更复杂的示例: condition = Array.new(rand(1..100)).map{|el| rand(1..10000)} #edge cases

我想根据运行时确定的条件跳过循环x次。我该怎么做

for i in (0..5)
  if i==0
    3.times {next} # i=i+3 also doesnt work
  end
  puts i
end
预期产出

3
4
5
编辑: 为了澄清,问题是
条件
(即i==0)和跳过
x
的迭代次数都是在运行时动态确定的,更复杂的示例:

condition = Array.new(rand(1..100)).map{|el| rand(1..10000)} #edge cases will bug out
condition.uniq!

for i in (0..10000)
  if condition.include? i
    rand(1..10).times {next} # will not work
  end
  puts i
end

按定义的倍数跳过的简单方法

array_list = (0..5).to_a
# Use a separate enum object to hold index position
enum = array_list.each 
multiple = 3

array_list.each do |value|
  if value.zero?     
    multiple.times { enum.next }
  end   
  begin puts enum.next rescue StopIteration end
end

按定义的倍数跳过的简单方法

array_list = (0..5).to_a
# Use a separate enum object to hold index position
enum = array_list.each 
multiple = 3

array_list.each do |value|
  if value.zero?     
    multiple.times { enum.next }
  end   
  begin puts enum.next rescue StopIteration end
end

不确定函数的确切输入和输出是什么。在你的例子中,为什么不直接使用
(3..5)。每个{i|put i}
@LeiChen,这显然是应该怎么做的,那么为什么不发布一个答案呢?可能是
def skip_(范围,nbr_to_skip)
。请查看我更复杂的示例对于您的“复杂”示例,我更希望提前计算数组
keepers
,这样您就可以在keepers中为I编写
。这可以写成
condition=Array.new(rand(1..4)).flat_-map do | el | first=rand(1..20);[*first..first+rand(0..4)];end.uniq#=>[7,8,9,18,6];守护者=[*1..20]-条件#=>[1,2,3,4,5,10,11,12,13,14,15,16,17,19,20]
。我意识到在其他情况下,如果……在块中,您将需要
下一步。不确定函数的确切输入和输出是什么。在你的例子中,为什么不直接使用
(3..5)。每个{i|put i}
@LeiChen,这显然是应该怎么做的,那么为什么不发布一个答案呢?可能是
def skip_(范围,nbr_to_skip)
。请查看我更复杂的示例对于您的“复杂”示例,我更希望提前计算数组
keepers
,这样您就可以在keepers中为I编写
。这可以写成
condition=Array.new(rand(1..4)).flat_-map do | el | first=rand(1..20);[*first..first+rand(0..4)];end.uniq#=>[7,8,9,18,6];守护者=[*1..20]-条件#=>[1,2,3,4,5,10,11,12,13,14,15,16,17,19,20]
。我意识到在其他情况下,如果……
在块中,您将需要
下一步;枚举=(0..5)。每个;循环do;如果enum.next.zero?,则为multiple.times{enum.next}?;打招呼;结束
<代码>“hi”打印三次。这是因为当试图超出枚举结束时,会引发
StopIteration
异常,并通过中断循环来处理异常。您可以改为将
enum=(0..5).写入_enum
,这可以说更具描述性。您可以更简洁地编写:
multiple=3;枚举=(0..5)。每个;循环do;如果enum.next.zero?,则为multiple.times{enum.next}?;打招呼;结束
<代码>“hi”打印三次。这是因为当试图超出枚举结束时,会引发
StopIteration
异常,并通过中断循环来处理异常。您可以改为将
enum=(0..5).to_enum
,这可能更具描述性。