Ruby 3.0 で Hash のキーを別のキーに置換する方法

例えば {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}

参考

bugs.ruby-lang.org

stackoverflow.com