シンボルとは
簡単に言うと文字列とほぼ同じ見た目のオブジェクト。
もうちょっと詳しく
Rubyの内部ではクラス名、メソット名、変数名などの名前を整数で管理しています。
シンボルも内部的には整数となります。
文字列で処理するより、整数で処理した方がパフォーマンス的に良いから!
不変性(Immutable)
シンボルは変わらないです。
シンボルオブジェクトの変更は不可能です。
メモリアドレスも変わらない
コードで見てみましょう
hello.rb
string_hello = 'hello'
symbol_hello = :hello
puts string_hello.object_id
puts symbol_hello.object_id
ruby hello.rb
# 2840185880
# 1056668
ruby hello.rb
# 2672372840
# 1056668
ruby hello.rb
# 2693385260
# 1056668
このようにRubyインタプリタがコードを読むたび文字列はメモリアカウントが変わることを確認できます。(object_idはメモリアカウントを返すメソットではありません。object_idが変わってないことはメモリアカウントが変わってないことで間接的に確認しただけです)
上記の理由でシンボルは処理速度が速いです。
メモリの消耗も低い利点があります。
Hashとシンボル
上記の理由でHashのkeyをシンボルにすると
文字列よりメモリ効率も良く、検索速度も早い長所があります。
文字列ではダメ!の場合以外はシンボルを使用した方が良いでしょう。