🗂

【Ruby 3.4 Advent Calender】frozen_string_literal: trueのデフォルト対応が始まる【3日目】

2024/12/03に公開

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

これはなに

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

frozen_string_literal がないファイルで定義した文字列リテラルに対して破壊的な変更をすると警告が出るようになる

Ruby 3.4 から『 frozen_string_literal のプラグマコメントがないファイルで定義した文字列リテラルに対して破壊的な変更をすると警告が出るようになる』ようになりました。
例えば次のようなファイルを実行すると警告がでます。

# warning: literal string will be frozen in the future (run with --debug-frozen-string-literal for more information)
"homu".upcase!

この警告は -W:deprecated(-W) もしくは Warning[:deprecated] = true のときのみ警告が出力されます。
逆にいうと上記の警告の設定が有効ではないデフォルトの状態では 警告はでない です。

また、冒頭にも書いたように frozen_string_literal: false プラグマコメントが書いてある場合は特に警告はでません。

# frozen_string_literal: false

# --W:deprecated が有効でも警告はでない
Warning[:deprecated] = true
"homu".upcase!

背景

この対応なんですが背景としては frozen_string_literal: true をデフォルトにする対応が今後行われる予定になっています。
しかし、いきなり frozen_string_literal: true をデフォルトにすると既存のコードが壊れてしまうためまずは『非互換になってしまう箇所を検知する仕組み』としてこの対応が Ruby 3.4 から導入されました。
具体的に frozen_string_literal: true をいつからデフォルトで有効にするのかは決まっていませんが警告が出る箇所があれば将来に備えてなにか対応しておくとよさそうです。

その他、詳しい振る舞いについては以下の記事を参考にしてください。

関連

GitHubで編集を提案

Discussion