🔍
Ruby3.0でSymbolクラスにnameメソッドが追加されていた
概要
Rails6から登場したファイルをオートロードするZeitwerkのコードを読んでいて、RubyのSymbolクラスにnameメソッドあったかなと思い、調べたので忘れないうちにメモ。
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
開発チケット
GitHubのPR
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