Ruby 1.9では、Hash#selectメソッドはハッシュを返すようになりました。 使いやすくなった反面、落とし穴も。 なお、以下はruby 1.9.3-p551, 2.3.1, 2.4.0で確認しました。

Hash#selectでは、Hash#default, Hash#default_procをコピーせずに新たなHashを作成して返すようです。 Hashをフィルタリングしたい時など、Hash#selectメソッドを利用する場合はよくあるので、できれば覚えておきたいところ。

下記はHash#default_procの例ですがHash#defaultも同じです。

# Symbolのkeyで見つからない場合は、Stringのkeyを戻すdefault_procをセットする
original = Hash.new {|hash,key| hash[key.to_s] if Symbol === key }
# Stringのkeyをセット
original['key'] = 'value'

# selectを通してみる
filtered = original.select { true }

# ==での比較がtrueになるので、一見全く同じに見える
p original == filtered # => true

p original['key'] # => "value"
# Symbolでも値が取得できる
p original[:key] # => "value"

p filtered['key'] # => "value"
# filteredには default_procがコピーされていないのでnilとなる
p filtered[:key] # => nil

# default_procをコピーする
filtered.default_proc = original.default_proc.dup

# valueが取得できる
p filtered[:key] # => "value"