📌
[Feature #20768] Hash から指定したキーの要素を削除する Hash#delete_at を追加する提案
[Feature #20768] Add Hash#delete_at
-
Hash
から指定したキーの要素を削除するHash#delete_at
を追加する提案
hash = { a: true, b: false }
# キーの値を配列で返す
# キーがない場合は nil を返す
a, c = hash.delete_at(:a, :c) # => [ true, nil ]
# hash からそのキーの要素は取り除かれる
hash # => { b: false }
- 上記は右代入でも同じ値を取得ことができるんですが
hash = { a: true, b: false }
# 右代入で a: の要素とそれ以外を受け取る
hash => { a:, c:, **rest }
a # => true
rest # => { b: false }
- キーが存在しない場合はエラーになると書いてありますね
hash = { a: true, b: false }
# error: {:a=>true, :b=>false}: key not found: :c (NoMatchingPatternKeyError)
hash => { a:, c:, **rest }
- こういうキーが存在しない場合は
Hash#delete
に合わせてブロック引数が呼び出される想定らしい
attributes = { disabled: true, aria: { label: "label text" } }
aria, data = attributes.delete_at(:aria, :data) { Hash.new }
aria # => { label: "label text" }
data # => {}
attributes # => { disabled: true }
- これなんですが、以下のようなコードで同等のことができるとコメントされてますねー
hash = { a: true, b: false }
a, c = [:a, :c].map { hash.delete(_1) }
p a # => true
p c # => nil
p hash # => {:b=>false}
- こういうのって
Hash#except!
でできなかったけ?と思ったけど#except
はあるけど#except!
はないのね - あと戻り値も『取り除いた値』じゃなくて『取り除かれなかった値』が返ってきますね
hash = { a: true, b: false }
pp hash.except(:b, :c)
# => {:a=>true}
- パッとユースケースは思いつかないけどあればなんか使いそうなメソッドではあるかな〜〜〜
Discussion