🔍

Ruby3.0でSymbolクラスにnameメソッドが追加されていた

2024/09/06に公開

概要

Rails6から登場したファイルをオートロードするZeitwerkのコードを読んでいて、RubyのSymbolクラスにnameメソッドあったかなと思い、調べたので忘れないうちにメモ。

https://github.com/fxn/zeitwerk/blob/41056489e7be446bf8e6b5e9ef5cd49d7c8751a9/lib/zeitwerk/cref.rb#L29-L42

nameメソッドが実装された背景

Symbol#to_sを使ってシンボルを文字列に変換する際、例えば:hoge.to_sのように何度も呼び出すと、その都度新しい文字列オブジェクトが作成されてしまいます。これにより、メモリ領域が無駄に消費される可能性があります。そこで、nameメソッドを導入して、キャッシュされた結果を返すことで、オブジェクトの生成を最小限に抑えることが目的です。

手元のirbで確認してみると、毎回:hoge.to_sを呼び出す度に、object_idが変わっちゃってるね(・ω・;) キャッシュしたいね...

irb(main):012> :hoge.to_s
=> "hoge"

irb(main):013> :hoge.to_s.object_id
=> 64460
irb(main):014> :hoge.to_s.object_id
=> 65920
irb(main):015> :hoge.to_s.object_id
=> 67380

開発チケット

https://bugs.ruby-lang.org/issues/16150

GitHubのPR

https://github.com/ruby/ruby/pull/3514

nameメソッドが実装された結果

irb(main):043> :hoge.name
=> "hoge"

irb(main):044> :hoge.name.object_id
=> 290440
irb(main):045> :hoge.name.object_id
=> 290440
irb(main):046> :hoge.name.object_id
=> 290440

何回呼び出しても同じオブジェクトIDが返ってくるね!
キャッシュされたことでメモリの効率が良くなったね!

おまけ

Ruby3はRuby3x3というパフォーマンス改善を目指していて、具体的には「Ruby3はRuby2の3倍速くする」とのことなので、こういった小さい改修も大切になってくるよね!

気になる方はRuby3.0のリリースも見てみてくださいね!(^_^)/~

Discussion