🐕
Ruby 3.4 で Hash.new に capacity: が指定できるようになった
Ruby 3.4 Advent Calender で書き残してたシリーズです。
Hash.new
に capacity:
が指定できるようになった
Ruby 3.4 から Ruby 3.4 から Hash.new
に capacity:
が指定できるようになりました。
# こんな感じで利用できる
hash = Hash.new(capacity: 1000)
これは事前に Hash
の容量を割り当てて置きたい時に利用することができます。
String.new(capacity: 1000)
とかと同じような感じですね。
これにより大規模な Hash
オブジェクトを生成する場合に効率化することができます。
Hash.new(capacity: 1000)
が非互換になる
注意点: これなんですが元々 Hash.new
の引数として要素が見つからなかったときの初期値を渡すことができました。
hash = Hash.new("none")
pp hash[:hoge] # => "none"
なので Ruby 3.4 以前では以下のように動いていました。
hash = Hash.new(capacity: 1000)
pp hash[:hoge] # => {:capacity=>1000}
これが Ruby 3.4 からは以下のように変わります。
hash = Hash.new(capacity: 1000)
pp hash[:hoge]
# Ruby 3.3 => {:capacity=>1000}
# Ruby 3.4 => nil
微妙に挙動が変わるのでご注意ください。
ちなみに Ruby 3.3 で上記のようなコードを書いた場合は -W:deprecated
の時に警告が出るようになっていました。
Warning[:deprecated] = true
# warning: Calling Hash.new with keyword arguments is deprecated and will be removed in Ruby 3.4; use Hash.new({ key: value }) instead
hash = Hash.new(capacity: 1000)
Discussion