如何在迭代数组时使用Array#delete?

我有一个数组,我想迭代并删除一些元素。 这不起作用:

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] 。 我怎样才能解决这个问题?

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 

你不必从数组中删除,你可以过滤它:

 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 

我不久前问过这个问题。

在Ruby中迭代时删除?

这不起作用,因为在尝试删除某些内容时,Ruby会退出.each循环。 如果你只是想从数组中删除东西, delete_if将会起作用,但是如果你想要更多的控制,那么我在这个线程中的解决scheme就可以工作,尽pipe它有点难看。

另一种方法是使用reject! ,这是可以更清楚的,因为它有一个! 这意味着“这将改变arrays”。 唯一的区别是reject! 如果没有改变,将返回nil

 a.delete_if {|x| x >= 3 } 

要么

 a.reject! {|x| x >= 3 } 

都将工作正常。