8

ハッシュからキーと値のペアを削除する非破壊的な方法はありますか?

たとえば、あなたがした場合

original_hash = {:foo => :bar}
new_hash = original_hash
new_hash = new_hash.reject{|key, _| key == :foo}

また

original_hash = {:foo => :bar}
new_hash = original_hash
new_hash = new_hash.dup
new_hash.delete(:foo)

その後、変更されoriginal_hashず、new_hash変更されますが、少し冗長です。ただし、

original_hash = {:foo => :bar}
new_hash = original_hash
new_hash.delete(:foo)

それからoriginal_hash変更されますが、それは私が望んでいることではありません。

私が望むことを行う単一の方法はありますか?

4

5 に答える 5

14

はい、あなたがしたいreject:

new_hash = original_hash.reject{|key, _| key == :foo}
于 2012-11-21T03:08:04.893 に答える
9

ActiveSupport はハッシュ拡張機能Hash#except を提供します。元のハッシュを変更せずに、指定したキー以外の新しいハッシュを返すことができます。

active_support gem がインストールされていると仮定します。

ruby-1.9.3> require 'active_support/core_ext/hash/except.rb'
 => true
 ruby-1.9.3> a = {x: 2, y: 1, z: 3}
 => {:x=>2, :y=>1, :z=>3} 
ruby-1.9.3> b = a.except(:x)
 => {:y=>1, :z=>3} 
ruby-1.9.3> c = a.except(:x, :y)
 => {:z=>3} 
ruby-1.9.3> a
 => {:x=>2, :y=>1, :z=>3} 
ruby-1.9.3> b
 => {:y=>1, :z=>3} 
ruby-1.9.3> c
 => {:z=>3} 
于 2012-11-21T03:09:39.363 に答える
1

問題は、オブジェクトを複製するよう Ruby に明示的に指示しない限り、new_hash が参照であることです。あなたは dup を使用して正しい軌道に乗っています。私が推奨する唯一のことは、

new_hash = original_hash.dup 

それはあなたがしていることについてより明確だと思うからです。

于 2012-11-21T03:02:11.097 に答える
0

重複を少なくするために dup をチェーン化するのはどうですか?

new_hash = original_hash.dup.delete_if{|key, _| key == :foo}
于 2012-11-21T03:03:42.793 に答える