3

我有一个数组arr。我想根据条件破坏性地删除元素arr,返回删除的元素。

arr = [1,2,3]  
arr.some_method{|a| a > 1} #=> [2, 3]
arr #=> [1]

我的第一次尝试是reject!

arr = [1,2,3]  
arr.reject!{|a| a > 1}

但返回块和arr的值都是[1].

我可以编写一个自定义函数,但我认为有一个明确的方法。那会是什么?

回答问题后更新:

partition方法结果对于实现哈希的这种行为也很有用。如何删除散列的元素,返回已删除的元素和修改后的散列?

hash = {:x => 1, :y => 2, :z => 3}
comp_hash, hash = hash.partition{|k,v| v > 1}.map{|a| Hash[a]}
comp_hash #=> {:y=>2, :z=>3}
hash #=> {:x=>1}
4

3 回答 3

5

我会partition在这里使用。它不会self就地修改,而是返回两个新数组。通过arr再次分配第二个数组,它会得到你想要的结果:

comp_arr, arr = arr.partition { |a| a > 1 }

请参阅partition 的文档

于 2012-12-06T11:38:32.507 回答
1

所有带有尾随 bang!的方法都会修改接收器,并且这些方法返回结果对象似乎是一种约定,因为非 bang 这样做。
你可以做的是这样的:

b = (arr.dup - arr.reject!{|a| a>1 })
b # => [2,3]
arr #=> [1]

这是一个ruby​​ 样式指南的链接,其中有一个关于命名的部分 - 虽然它相当短

于 2012-12-06T11:24:48.480 回答
0

要删除(就地)返回已删除元素的数组元素,可以使用 delete 方法,根据Array 类文档

a = [ "a", "b", "b", "b", "c" ]
a.delete("b")                   #=> "b"
a                               #=> ["a", "c"]
a.delete("z")                   #=> nil
a.delete("z") { "not found" }   #=> "not found"

它接受块,因此可以根据需要添加自定义行为

于 2014-02-05T17:42:56.223 回答