💡

【Ruby 3.4 Advent Calender】Hash#inspect がシンボル表記になる【7日目】

2024/12/07に公開

Ruby 3.4 Advent Calender 7日目の記事です。

これはなに

今年 2024年12月25日にリリースされる予定の Ruby 3.4 の新機能や変更点などを1つずつ紹介していく Advent Calender になります。
基本的には NEWS に載っている機能を紹介すると思うんですがここにない機能についても書くかもしれません。
また、記事を書いてる時点ではまだ Ruby 3.4 はリリースされる前なので Ruby 3.4 がリリースされた時点で機能が変わっている 可能性があるかもしれないので注意してください。
記事のまとめは ここを参照 してください。

Hash#inspect / pretty_print_inspect がシンボル表記になる

今までは Hash#inspect の結果は key => value のように => で表記されていました。

hash = { id: 1, name: "homu", age: 14 }

puts hash.inspect
# => {:id=>1, :name=>"homu", :age=>14}

これが Ruby 3.4 からはシンボル(:)の表記に置き換えられます。

hash = { id: 1, name: "homu", age: 14 }

puts hash.inspect
# {id: 1, name: "homu", age: 14}

またキーがシンボルではない場合は依然として => の表記になります。

hash = { "hoge" => "string", [1, 2] => "array", 1 => "integer" }

puts hash.inspect
# => {"hoge" => "string", [1, 2] => "array", 1 => "integer"}

Hash#inspectp で Hash#pretty_print_inspectpp` でそれぞれ利用されているメソッドですね。

元々は { :a? => 1 , :== => 1, :< => 1 } みたいな値のときに Ruby として有効な構文でない結果を返す話から発展した形になります。

hash = { :a? => 1 , :== => 1, :< => 1 }

puts hash.inspect
# Ruby 3.3 => {:a?=>1, :===>1, :<=>1}
# Ruby 3.4 => {a?: 1, "==": 1, "<": 1}

普段遣いは問題ないと思うんですが Hash#inspect の値に依存するような場合(特にテストなどで使用している場合)には非互換な挙動になるので注意してください。

関連

GitHubで編集を提案

Discussion