例えば {foo: 1, bar: 2, baz: 3} という Hash のキーのうち、 :baz を :foobar に置換して {foo: 1, bar: 2, foobar: 3} にしたいとします。
Ruby 2.7 以前の場合
Ruby 2.7 以前だと Hash#transform_keys のブロックの中で条件分岐させたりと少し面倒です。
# 2.7.2 hash = {foo: 1, bar: 2, baz: 3} hash.transform_keys { |key| key == :baz ? :foobar : key } #=> {:foo=>1, :bar=>2, :foobar=>3}
Hash#transform_keys (Ruby 3.0.0 リファレンスマニュアル)
他には Hash#delete を使って元の Hash を破壊してしまう方法もあります。
# 2.7.2 hash = {foo: 1, bar: 2, baz: 3} hash[:foobar] = hash.delete(:baz) hash #=> {:foo=>1, :bar=>2, :foobar=>3}
Hash#delete (Ruby 3.0.0 リファレンスマニュアル)
Ruby 3.0 の場合
Ruby 3.0 では Hash#transform_keys の引数に {置換前のキー => 置換後のキー} の Hash を渡すことで簡単に置換できます。
# 3.0.0-preview2 hash = {foo: 1, bar: 2, baz: 3} hash.transform_keys(baz: :foobar) #=> {:foo=>1, :bar=>2, :foobar=>3}