【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}
便利そうと思いつつあんまりユースケースが思い浮かばないんですが覚えておくといざという時に役立ちそうですね。