Ruby 如何在迭代数组时修改迭代器
我想根据运行时确定的条件跳过循环x次。我该怎么做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
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
,这可能更具描述性。