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

时间:2010-07-15 22:51:43

标签: ruby arrays iteration

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

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]。我怎么能绕过这个?

4 个答案:

答案 0 :(得分:113)

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

请参阅方法文档here

更新

您可以在块中处理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

答案 1 :(得分:7)

您不必从数组中删除,您可以对其进行过滤:

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

答案 2 :(得分:3)

我不久前问了这个问题。

Deleting While Iterating in Ruby?

它不起作用,因为Ruby在尝试删除某些内容时会退出.each循环。如果你只是想从数组中删除东西,delete_if会起作用,但是如果你想要更多的控制,我在那个线程中的解决方案是有效的,虽然它有点难看。

答案 3 :(得分:2)

另一种方法是使用reject!,这可以说更清晰,因为它有一个!,这意味着&#34;这将改变数组&#34;。唯一的区别是,如果未进行任何更改,reject!将返回nil

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

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

两者都可以。