🐥

【Ruby 3.4 Advent Calender】Symbol#to_s の戻り値がチルド文字列になる【17日目】

2024/12/17に公開

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

これはなに

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

Symbol#to_s の戻り値がチルド文字列になる

下記の記事でも書いたのですが Ruby 3.4 から frozen_string_literal: true にする対応がはじまります。

これにより以下のように文字列リテラルに対して破壊的な変更が行われるときに警告が出るようになります。

# NOTE: -W や -W:deprecated がついているときのみ警告が出る
# warning: literal string will be frozen in the future (run with --debug-frozen-string-literal for more information)
"hoge".upcase!

この『破壊的な変更が行われるときに警告を出す文字列』のことを通称『チルド文字列』と読んでいます。
要は『freeze されていないけど freeze されているように振る舞う』ってことで『チルド状態』みたいな意味合いですね。

で、このチルド文字列なんですが Symbol#to_s がこのチルド文字列を返すようになりました。
どういうことかというと次のように Symbol#to_s の結果に対して破壊的な変更を行うと警告が出るようになります。

# NOTE: -W や -W:deprecated がついているときのみ警告が出る
# warning: string returned by :hoge.to_s will be frozen in the future
:hoge.to_s.upcase!

これは将来的に Symbol#to_s の戻り値を frozen にしたいのでその下準備的な対応ですね。
以前 Symbol#to_s の戻り値を frozen string にする提案があってそのときに一瞬 Symbol#to_s の戻り値が frozen になったんですが影響範囲が大きすぎて断念した背景があります。
今回のチルド文字列を返すことで段階的に frozen 化したい、というのが背景になります。

ちなみに Symbol#name は frozen 化された文字列を返すので高速化したい場合はそちらを利用することもできます。

# こっちは frozen ではない
pp :hoge.to_s.frozen? # => false

# こっちは frozen
pp :hoge.name.frozen? # => true

関連

GitHubで編集を提案

Discussion