へい

学んだこととか、思ったこと。プログラミングしてみたり、野球したり、筋トレしたり、hiphop聞いたり、格闘技見たりするのが好き。

rubyのシンボルについてのお話

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

変更できませんでした。

というお話です。