rubyのシンボルについてのお話
rubyを触り始めた頃、シンボルとはなんぞやと謎に思い、調べてみたら、まぁ文字列とそんなに変わらない。という結論に至ったが、 やっぱり違うだろう。とふと思いました。普段の開発ではあまり気にする場面が少なかったシンボルについてもう一度勉強し直してみました。 参考にしたのは
シンボルの定義
さすがに知っているとは思いますが。。。。
:シンボル名
ですね。
本題
シンボルと文字列の違い
1. オブジェクトが違う
まぁ、当たり前ですよね。
2. 高速に処理される
シンボルと文字列は同じようなものと捉えられがちですが、シンボルの中身は整数らしいです。 したがって、比較する場合、二つの値が同じかどうか調べる場合、文字列よりも高速に処理されます。
3. メモリの使用効率が良い
シンボルは「同じシンボルであれば同じオブジェクト」という特徴があります。 これによって文字列、シンボル、共に大量に作成した場合、シンボルの方がメモリ使用効率が良いそうです。 なに言っているかさっぱりな人のために↓
% irb irb(main):001:0> 'string'.object_id => 70151974972520 irb(main):002:0> 'string'.object_id => 70151974957260 irb(main):003:0> 'string'.object_id => 70151974942200
irb(main):004:0> :string.object_id => 272348 irb(main):005:0> :string.object_id => 272348 irb(main):006:0> :string.object_id => 272348
シンボルが同じオブジェクトであることがわかりますね。
4. 破壊的な変更ができない(イミューダブルなオブジェクト)
irb(main):011:0> a = 'string' => "string" irb(main):012:0> a.upcase! => "STRING" irb(main):013:0> a => "STRING" irb(main):014:0> b = :string => :string irb(main):015:0> b.upcase! NoMethodError: undefined method `upcase!' for :string:Symbol
変更できませんでした。
というお話です。