【Ruby 3.0 Advent Calendar 2020】Ruby 3.0 で追加・変更される Hash のメソッド【13日目】

Ruby 3.0 Advent Calendar 2020 13日目の記事になります。
昨日は『銀座Rails#26で Ruby 3.0 の話をした』です。
今日は Ruby 3.0 で新しく Hash クラスに追加・変更される2つのメソッドの紹介です。

任意のキーの要素を取り除く Hash#except メソッド

ActiveSupport でおなじみの Hash#except がついに Ruby 3.0 で標準ライブラリに追加されました。
Hash#except は引数のキーを Hash から取り除くメソッドです。

hash = { id: 1, name: "homu", age: 14 }

# 引数のキーを取り除く
pp hash.except(:id, :age)
# => {:name=>"homu"}

これが欲しかった方も多いのではないでしょうか。
わたしもちょうど以下のようなケースでほしいと思っていたんですよねー。

def hoge(option)
  # 特定のオプションを取り除いてから別のメソッドに譲渡する
  foo(option.except(:bar_flag))
end

便利そう。

Hash#transform_keys で簡単に任意のキー名を別のキー名に置き換えられるようになった

今までの Hash#transform_keys ブロック引数でキーの値を一括で変換するような事が行えました。

hash = { id: 1, name: "homu", age: 14 }
# キーを Symbol から String に変換する
pp hash.transform_keys(&:to_s)
# => {"id"=>1, "name"=>"homu", "age"=>14}

Ruby 3.0 では次のように Hash を渡すことで任意のキーの値を別のキーの値に置き換える事ができます。

# 特定のキーを別のキーに置き換える
hash = { id: 1, name: "homu", age: 14 }
pp hash.transform_keys({ name: :name_key, age: "age_key" })
# => {:id=>1, :name_key=>"homu", "age_key"=>14}

これは直感的でわかりやすいですね。
更に Hash とブロックの両方を渡すと『 Hash で渡されなかったキー』のみがブロックで反映されます。

hash = { id: 1, name: "homu", age: 14 }
pp hash.transform_keys({ name: :name_key, age: "age_key" }, &:to_s)
# => {"id"=>1, :name_key=>"homu", "age_key"=>14}

便利そうと思いつつあんまりユースケースが思い浮かばないんですが覚えておくといざという時に役立ちそうですね。