🐕

Ruby 3.4 で Hash.new に capacity: が指定できるようになった

2024/12/27に公開

Ruby 3.4 Advent Calender で書き残してたシリーズです。

Ruby 3.4 から Hash.newcapacity: が指定できるようになった

Ruby 3.4 から Hash.newcapacity: が指定できるようになりました。

# こんな感じで利用できる
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)
GitHubで編集を提案

Discussion