🍣
[Feature #20769] Hash#transform_value を追加する提案
[Feature #20769] Add Hash#transform_value
-
Hash#transform_value
を追加する提案 - 既存で
Hash#transform_values
はすでに存在しており、それは Hash の要素をすべてをイテレーションします
data = { a: 1, b: 2, c: 3 }
pp data.transform_values { _1 + _1 }
# => {:a=>2, :b=>4, :c=>6}
-
Hash#transform_value
は特定の要素のみを変換する、という目的みたいですね - 以下のように特定の要素の値を変換する感じです
homu = { name: "homu", age: 14 }
pp data.transform_value(:name) { _1.upcase }
# => {:name=>"HOMU", :age=>14}
- 現状だと以下のようにかけるらしい
homu = { name: "homu", age: 14 }
pp homu.merge(name: homu[:name].upcase)
# => {:name=>"HOMU", :age=>14}
- あとコメントだともうちょいシンプルなコードも書いてありますね
homu = { name: "homu", age: 14 }
pp homu.merge(name: nil) { |_, name| name.upcase }
# => {:name=>"HOMU", :age=>14}
- ただ、提案した
Hash#transform_value
は『引数のキーが存在しない場合はブロックを呼ばない』という機能も含めているとのこと- https://bugs.ruby-lang.org/issues/20769#note-2
- これを考慮するなら
#merge
を使用するのはちょっとつらそう
- matz はユースケースがわからない、とコメントしてますねー
- あると便利そうだけど、実際に必要なケースってどれぐらいあるかなー
- 最初にわたしがあげた例だと以下のようにかいちゃいそう
homu = { name: "homu", age: 14 }
homu[:name] = homu[:name].upcase
# 破壊的な変更をしていいならこっちでも
# homu[:name].upcase!
Discussion