我有一个数组,我想迭代并删除一些元素。这不起作用:
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]
。我怎么能绕过这个?
答案 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 }
两者都可以。