私は配列を持ってい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}