## 概要 Rubyでは、以下のように`shareable_constant_value: literal`というマジックコメントを記入することで、 以下の例のように、定数に代入したArrayやHashのリテラルを深く(deeply)freezeすることが出来ます。 ```ruby # shareable_constant_value: literal X = [{foo: []}] X.frozen? # => true X[0].frozen? # => true X[0][:foo].frozen? # => true ``` ## 少し詳しい話 `shareable_constant_value`マジックコメントはRuby 3.0で導入されました。 ### 注意点 このマジックコメントのliteralモードでfreezeされるのは定数が対象であるため、 以下のように、代入先が変数である場合にはfreezeされません。 ```ruby # shareable_constant_value: literal z = [] z.frozen? # => false ``` また、このマジックコメントのliteralモードを指定したファイル内では、以下のように、 「freezeされていないオブジェクト」や「freezeされていないものを含むオブジェクト」を定数に代入しようとするとエラーが発生します。 ```ruby # shareable_constant_value: literal Y = [{}, Object.new] # => エラー発生 ``` 裏を返せば、以下のように、freezeすればエラーが回避できます。 また、freezeする定数とfreezeしない定数でファイルを分けるという自然なアプローチでもエラーを回避できます。 ```ruby # shareable_constant_value: literal Y = [{}, Object.new.freeze] ``` ## 参考文献 - [Ruby公式のshareable_constant_valueのドキュメント](https://github.com/ruby/ruby/blob/master/doc/syntax/comments.rdoc#label-shareable_constant_value+Directive)