2

所以我有这种情况,我需要有条件地从数组中删除一些东西,这意味着我想遍历数组中的项目并进行测试并删除通过测试的项目,然后我想获取那个已删除的项目背部。如果我排除了它的条件方面,那么Array#delete基本上我想要做的 - 返回已删除的项目,但不能有条件地删除。另一方面,delete_if 有条件地删除项目,但将剩余项目返回到数组中。

出于本问题的目的,假设以下类别:

class Foo
  def test?
    #returns true or false
  end
end

我可以通过执行以下操作轻松重现此行为:

index = my_array.index {|a| a.test?}
item_to_delete = my_array[index]
my_array.delete item_to_delete

但我希望能找到类似的东西:

deleted_item = my_array.delete_if_and_return_deleted {|a| a.test?}

我对必须多次遍历数组来完成这项工作并不感到兴奋:/首先找到目标的索引,第二次获取目标,第三次删除目标。伊克。

有什么想法或建议吗?

4

1 回答 1

4

你想要的是分区方法:

deleted_items, kept_items = my_array.partition {|a| a.test?}
于 2016-07-11T19:19:28.110 回答