タイトルは釣りです。すみません。Ruby 3.0 はかなり先の将来の話なので、最終的にどうなるかはわかりません。でも Ruby 3.0 に重大な変更が予定されているのは事実なので、一緒に考えて欲しいと思います。





つまり、次のようなプログラムが動かなくなります。(当チケットから少し改変して引用）

immutable なオブジェクトは改変されないため、このような最適化を行っても（ほぼ）問題ありません。そしてこの最適化は、プログラム内の ホットスポット を高速化するためには確かに有用です。

今の Ruby は、文字列 リテラル に .freeze がついているとき、ちょっとした最適化を行います。"".freeze は毎回文字列オブジェクトを生成せず、常に同じオブジェクトを返す、というものです。

そしてさらに悪いことに、「すべての文字列 リテラル にアホのように .freeze をつけるプルリク エス ト」とかが送られてきて、 Rails の開発者を悩ませているそうです。immutable string literal 推進者たちはこれを『社会問題』と呼んでいます。

しかし Rails 界隈を中心として、 ボトルネック かどうかを考えること無く、文字列 リテラル に片っ端から .freeze をつける、ということが行われているそうです。

これで問題が報告されなければ、 Ruby 3.0 では immuable がデフォルトになり、逆に破壊的変更を可能 (mutable) にしたい人が mutable_string_literal みたいなマジックコメントを入れることになる、という計画です。

当然、既存のプログラムがいろいろ動かなくなる可能性があります。どうすればいいかというと、

上記の『社会問題』を解決するため、「 Ruby 3.0 ではいちいち .freeze をつけなくてもデフォルトで .freeze をつけたことにしてしまおう」という『決定』がなされました。

思うところ

以下、自分の意見です。考えが整理しきれてはいませんが、端的に言えば大反対です。最初に聞いたとき、耳を疑いました。Ruby にはこれまでも不思議な決定がなかったわけではないですが、今回は突出して過去最悪な判断だと直感が告げています。

先に書いておくと、理性的に一番問題だと思うのは「問題 2」、感情的には「問題 1」と「問題 6」です。

問題 4: 別のインターフェイスがほとんど検討されていない気がする （この辺からあんまり考えがまとまってないです。） どっかで議論されてるのかもですが、マジックコメントというインターフェイスは本当に適切なんですかね。移行パスとしても、ひょっとしたら将来的にマジコメのまま落ち着く機能としても、微妙だと思っています。 まず、ファイル単位にすることに意義がある気がしません。マジコメ付きのファイル a.rb で作った文字列を、マジコメなしのファイル b.rb で使ったら、結局例外になるので。 プロセス単位で挙動を変えるために、コマンドライン引数として --enable-frozen-string-literal を渡す、という手段も用意されています。移行パスとしてはそれだけでいい気も。 プロセス単位の挙動をプログラム的に決定する方法も提供すべきだと思うんですよね。デフォルトは mutable のままにして、require にオプションつけて require "app.rb", immutable: true とロードしたら app.rb の中の文字列は immutable になるとか、 RubyVM::ImmutableStringLiteral = true としたらそれ以後 eval/require/load される文字列は immutable になるとかの方が、Rails みたいなフレームワークと相性がいい気がするのですが。 どうも煮詰められていないまま『決定』してしまった印象があります。 【追記】RubyVM::InstructionSequence.compile_option= {frozen_string_literal: true} があるそうです（@_ko1 さんのツイート）。こっち使うといいんですかね。例に出しておいてなんですが、RubyVM は安心して依存できなさそうな気配満載の API なので、もうちっと他の名前の方がいいとは思います。



問題 5: Rails ユーザ以外は全然嬉しくない この問題はあまり同意されなさそうだけど一応書きます。 そもそも Ruby って書き捨てプログラム用言語だと思うのですが、そう考えているような人には、この『決定』は煩わしいだけで、何の恩恵もありません。ruby -e から始まるワンライナーで mutable_string_literal マジコメを入れるとかありえない。。。 もちろん程度問題なので、「これによって Rails が 10 倍速くなることが確認されています！」とか言うのであれば妥協の余地もあると思うのですが、『社会問題』のためというのは、あまりにも納得しがたいものがあります。