在Ruby中迭代时删除?

我正在迭代一大堆字符串,它们遍历一小组字符串。 由于大小,这种方法需要一段时间才能完成,所以为了加快速度,我试图从较小的集合中删除字符串,不再需要随之使用。 以下是我目前的代码:

Ms::Fasta.foreach(@database) do |entry| all.each do |set| if entry.header[1..40].include? set[1] + "|" startVal = entry.sequence.scan_i(set[0])[0] if startVal != nil @locations << [set[0], set[1], startVal, startVal + set[1].length] all.delete(set) end end end end 

我面临的问题是,简单的方法, array.delete(string) ,有效地将一个break语句添加到内部循环中,这会混淆结果。 我知道如何解决这个问题的唯一方法是这样做:

 Ms::Fasta.foreach(@database) do |entry| i = 0 while i < all.length set = all[i] if entry.header[1..40].include? set[1] + "|" startVal = entry.sequence.scan_i(set[0])[0] if startVal != nil @locations << [set[0], set[1], startVal, startVal + set[1].length] all.delete_at(i) i -= 1 end end i += 1 end end 

这对我来说有些邋.. 有一个更好的方法吗?

使用delete_if

 array.delete_if do |v| if v.should_be_deleted? true else v.update false end end 

使用’arr.shift’

 a=[1,2,3,4] while(a.length!=0) print a a.shift print "\n" end 

输出:

[1,2,3,4]
[2,3,4]
[3,4]
[4]