この記事はギークハウス新宿界隈 Advent Calendar 2018 7日目の記事です。
##はじめに
公式ドキュメントでは、シンボルついて以下のように説明されています。
シンボルを表すクラス。シンボルは任意の文字列と一対一に対応するオブジェクトです。
文字列の代わりに用いることもできますが、必ずしも文字列と同じ振る舞いをするわけではありません。 同じ内容のシンボルはかならず同一のオブジェクトです。
なんとなく、「文字列と似たような働きができるのかな?」程度は理解できるのですが、
この説明だけでは文字列と比較して、どのような利点があるのかがわからなかったのでまとめてみました。
##基本形
:symbol_name
##シンボルと文字列の違い
###クラスが違う
- シンボルはSymbolクラス
:apple.class #=> Symbol
- 文字列はStringクラス
'apple'.class #=> String
###処理速度がシンボルの方が速い
シンボルは表面的には文字列と同じように見えますが、整数として管理されるために文字列より高速に処理されます。
###メモリの使用効率が良い
シンボルが同じであれば全く同じオブジェクトになるため、文字列よりもシンボルの方がメモリの使用効率が良くなります。
※同じオブジェクトであるかは、object_idメソッドでわかる。
#シンボル
:apple.object_id #=> 1282588
:apple.object_id #=> 1282588
#文字列
'apple'.object_id #=> 70191702696840
'apple'.object_id #=> 70191706838180
###シンボルはイミュータブルなオブジェクト
シンボルは文字列と違いイミュータブルなオブジェクトであるため、文字列のように破壊的な変更はできません。
名前を指し示す時に使うことで、勝手に名前を変更されないようにすることができます。
イミュータブルがわからない方はこちらを参照
string = 'apple' #=> "apple"
string.upcase! #=> "APPLE"
string #=> "APPLE"
symbol = :apple #=> :apple
symbol.upcase! #=> NoMethodError (undefined method `upcase!' for :apple:Symbo
##用途
文字列と比較した時の処理速度の速さと、メモリの使用効率の良さを活かし、
名前を識別したいが、その名前が文字列である必要がない場合に使われます。
以下、代表的な利用例。
###ハッシュのキー
{:name => 'Tom', :mail => 'tom@mail.com'}
###アクセサの引数で渡すインスタンス変数名
attr_render :name