RubyのArrayやHashのリテラルをdeep freezeするshareable_constant_valueマジックコメント 31 views Post @wakairo 24時間2024/12/04 11:44 概要 Rubyでは、以下のようにshareable_constant_value: literalというマジックコメントを記入することで、 以下の例のように、定数に代入したArrayやHashのリテラルを深く(deeply)freezeすることが出来ます。 # 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されません。 # shareable_constant_value: literal z = [] z.frozen? # => false また、このマジックコメントのliteralモードを指定したファイル内では、以下のように、 「freezeされていないオブジェクト」や「freezeされていないものを含むオブジェクト」を定数に代入しようとするとエラーが発生します。 # shareable_constant_value: literal Y = [{}, Object.new] # => エラー発生 裏を返せば、以下のように、freezeすればエラーが回避できます。 また、freezeする定数とfreezeしない定数でファイルを分けるという自然なアプローチでもエラーを回避できます。 # shareable_constant_value: literal Y = [{}, Object.new.freeze] 参考文献 Ruby公式のshareable_constant_valueのドキュメント 記入 プレビュー Markdownの書き方
@wakairo 24時間2024/12/04 11:44 概要 Rubyでは、以下のようにshareable_constant_value: literalというマジックコメントを記入することで、 以下の例のように、定数に代入したArrayやHashのリテラルを深く(deeply)freezeすることが出来ます。 # 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されません。 # shareable_constant_value: literal z = [] z.frozen? # => false また、このマジックコメントのliteralモードを指定したファイル内では、以下のように、 「freezeされていないオブジェクト」や「freezeされていないものを含むオブジェクト」を定数に代入しようとするとエラーが発生します。 # shareable_constant_value: literal Y = [{}, Object.new] # => エラー発生 裏を返せば、以下のように、freezeすればエラーが回避できます。 また、freezeする定数とfreezeしない定数でファイルを分けるという自然なアプローチでもエラーを回避できます。 # shareable_constant_value: literal Y = [{}, Object.new.freeze] 参考文献 Ruby公式のshareable_constant_valueのドキュメント
概要
Rubyでは、以下のように
shareable_constant_value: literal
というマジックコメントを記入することで、 以下の例のように、定数に代入したArrayやHashのリテラルを深く(deeply)freezeすることが出来ます。少し詳しい話
shareable_constant_value
マジックコメントはRuby 3.0で導入されました。注意点
このマジックコメントのliteralモードでfreezeされるのは定数が対象であるため、 以下のように、代入先が変数である場合にはfreezeされません。
また、このマジックコメントのliteralモードを指定したファイル内では、以下のように、 「freezeされていないオブジェクト」や「freezeされていないものを含むオブジェクト」を定数に代入しようとするとエラーが発生します。
裏を返せば、以下のように、freezeすればエラーが回避できます。 また、freezeする定数とfreezeしない定数でファイルを分けるという自然なアプローチでもエラーを回避できます。
参考文献