💨
Ruby の Hash#update メソッド
知らなかったので覚書。
Ruby の Hash#update では以下のようにレシーバの値を上書きすることができます。
user = { id: 1, name: "homu", age: 14 }
# user の値が書き換わる
user.update(id: 2, name: "mami", age: 15)
pp user
# => {id: 2, name: "mami", age: 15}
ActiveRecord::Base#update みたいな挙動ですね。
また、次のように存在しない要素は追加されたりします。
user = { name: "homu", age: 14 }
# 存在しないキーの要素は追加される
user.update(id: 2, name: "mami", age: 15, tag: :girl)
pp user
# => {name: "mami", age: 15, id: 2, tag: :girl}
この Hash#update なんですが実は Hash#merge! の別名になっています。
なので Hash#merge! でも同様の挙動になります。
user = { id: 1, name: "homu", age: 14 }
user.merge!(id: 2, name: "mami", age: 15)
pp user
# => {id: 2, name: "mami", age: 15}
逆に Hash#update でも Hash#merge! と同じことができます。
user = { name: "homu", age: 14 }
# Hash#merge! と同様にブロックを渡すと値を制御できる
user.update(id: 2, name: "mami", age: 15, tag: :girl) { [_2, _3] }
pp user
# => {name: ["homu", "mami"], age: [14, 15], id: 2, tag: :girl}
名前的には Hash#merge! よりも Hash#update のほうがわかりやすいんですが Rails を使用していると ActiveRecord::Base#update と間違いそうなのでややこしい。
Discussion