我有一个要迭代并删除某些元素的数组。这不起作用:
a = [1, 2, 3, 4, 5]
a.each do |x|
next if x < 3
a.delete x
# do something with x
end
a #=> [1, 2, 4]
我想a
成为[1, 2]
。我该如何解决?
Answers:
a.delete_if { |x| x >= 3 }
在此处查看方法文档
更新:
您可以在代码块中处理x:
a.delete_if do |element|
if element >= 3
do_something_with(element)
true # Make sure the if statement returns true, so it gets marked for deletion
end
end
x
如果它被删除,我需要做一些事情。我应该把它放在块里吗?
reject!
。
reject!
它将返回nil
,而delete_if
返回原始数组。
您不必从数组中删除,可以对其进行过滤,以便:
a = [1, 2, 3, 4, 5]
b = a.select {|x| x < 3}
puts b.inspect # => [1,2]
b.each {|i| puts i} # do something to each here
.select
返回一个新的ruby对象,它将使用更多的内存。参见此示例pastebin.com/23e10bKy
我不久前问了这个问题。
它不起作用,因为Ruby.each
在尝试删除某些内容时会退出循环。如果您只是想从数组中删除内容,那是delete_if
可行的,但是如果您想要更多控制权,那么我在该线程中拥有的解决方案就可以了,尽管有点难看。
each
通过使用索引有效地进行迭代。因此,如果删除,索引将不同,下一次迭代将使用新索引。试试这个:arr = [1,2,3,4,5,6]; arr.each_with_index {|e,i| p [arr, e, i]; next if e < 3; arr.delete e }
。到达第3项时,索引为2。删除3后,下一个迭代将索引递增为3,并且该项为5。因此跳过了4。出于相同的原因,跳过了6。