Rubyのシンボル(:XXXX)と文字列(‘XXXX’)の違い

似てるようで違うシンボルと文字列の違いとは

シンボルと文字列の書き方は以下の通りの違いがあります。

:symbol.class  # => symbol
'string'.class # => string

シンボルは整数として管理されるため、文字列より速く処理が可能になります。

例は以下の通りです。

#文字列よりシンボルのほうが処理が速い
'pen' == 'pen'
:pen == :pen

メモリの使用効率の違い

シンボルと文字列ではメモリの使用効率の違いがあります。

シンボルの場合は再定義をしても同じメモリを使用しますが

文字列の場合は、再度違うメモリが配置されます。

 

例としては以下のとおりです。

puts :symbol.object_id # => 811228
puts :symbol.object_id # => 811228
puts :symbol.object_id # => 811228

puts 'string'.object_id # => 70252239918060
puts 'string'.object_id # => 70252239917800
puts 'string'.object_id # => 70252239917620

また、以下のような破壊的変更をするとシンボルの場合はエラーとなります

string = 'pen'
string.upcase!
puts string # => PEN

symbol = :apple
puts symbol.upcase # => APPLE
puts symbol.upcase! # => ERROR undefined method `upcase!'

詳細は以下にも記載しています。

Rubyのミュータブル/イミュータブルについて

シンボルを利用する大きなメリット

  • 数値扱いとなり高速な処理ができる
  • メモリの使用効率がいい
  • イミュータブルなので、間違って値を変えられる心配がない

などあります。

 

Webサイト開発などでは処理速度が重要になってきます。

意識して使うようになるといいですね!(*^^*)

 

何かの参考になれば幸いです。