我有一个阵列arr.我想arr根据条件破坏性地删除元素,返回已删除的元素.
arr = [1,2,3]
arr.some_method{|a| a > 1} #=> [2, 3]
arr #=> [1]
Run Code Online (Sandbox Code Playgroud)
我的第一次尝试是reject!:
arr = [1,2,3]
arr.reject!{|a| a > 1}
Run Code Online (Sandbox Code Playgroud)
但是返回的块和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}
Run Code Online (Sandbox Code Playgroud)
我在partition这里用.它不会在内部修改self,但会返回两个新数组.通过arr再次分配第二个数组,它可以获得您想要的结果:
comp_arr, arr = arr.partition { |a| a > 1 }
Run Code Online (Sandbox Code Playgroud)
请参阅分区文档.