🍣

[Feature #20769] Hash#transform_value を追加する提案

2024/10/03に公開

[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 は『引数のキーが存在しない場合はブロックを呼ばない』という機能も含めているとのこと
  • matz はユースケースがわからない、とコメントしてますねー
  • あると便利そうだけど、実際に必要なケースってどれぐらいあるかなー
  • 最初にわたしがあげた例だと以下のようにかいちゃいそう
homu = { name: "homu", age: 14 }
homu[:name] = homu[:name].upcase
# 破壊的な変更をしていいならこっちでも
# homu[:name].upcase!
GitHubで編集を提案

Discussion