[Ruby]シンボルとは

0
202
views

シンボル(Symbol)はRubyオブジェクトの1つです。

シンボルの表現方法

文字列はダブルクォーテーション(”)で囲むことで String 型と認識されます。一方、シンボルは任意のシンボル名の前にコロン(:)を置くことで Symbol 型と認識されます(前置コロン)。

str = "名前"
sym = :name

p str.class
p sym.class
String
Symbol

ハッシュでシンボルを使う

Hash を作るときに Symbol がよく利用されます。比較としてまずは、文字列をキーにして Hash を作る例です。

baby = {"name" => "Rick Ross", "age" => 1, "origin" => "Compton"}

次に Symbol で Hash を作る例です。通常、Hash のキーとして Symbol を指定する際は、シンボル名に後置コロンを使います。

boy = {name: "Kendrick Lamar", age: 3, origin: "Miami"}

String, Symbol それぞれで作った Hash の中身を見てみます。

p baby
p boy
{"name"=>"Rick Ross", "age"=>1, "origin"=>"Compton"}
{:name=>"Kendrick Lamar", :age=>3, :origin=>"Miami"}

シンボルを使うメリット

Hash で Symbol を使うメリットは次の2つです。

1.可読性が高い

Hash を文字列をキーにして作る場合、シンボルをキーにして作る場合を比較した上記の例からも分かる通り、データ構造の見通しが良くなります。

2.省メモリ

文字列をキーにした場合に比べ、シンボルを使う場合は使用メモリが節約できます。

オブジェクト参照の違い(文字列/シンボル)

シンボルは一度生成されると、何度変数に代入しても同じ領域のメモリを参照します(ポインタ)。対して、文字列の場合は、表面上は同じ文字列でも、代入するたびに新しいオブジェクトを生成します。

str1 = "name"
str2 = "name"
p str1.object_id
p str2.object_id
p str1.equal?(str2)

実行結果の通り、表面上は同じ文字列を代入しても、オブジェクトの中身は異なることが分かります。

70368313072900
70368313072880
false

シンボルの場合は、シンボル名が同じであれば、同じオブジェクトを参照することになるので、文字列を利用した場合に比べ、メモリの消費を押さえることができます。

sym1 = :name
sym2 = :name
p sym1.object_id
p sym2.object_id
p sym1.equal?(sym2) 
88348
88348
true

まとめ: シンボルとは

文字列の皮を被った数値。コード上は文字列で見えてるけど内部では数値として扱われる。比較、検索に関して速度面で有利なので、主にデータの名前に使うと吉。

たとえばハッシュのキーだったり、メソッドに渡すクラス名/メソッド名/変数名/定数名だったりとか。ステータス名なんかも、文字列自体がデータではないのでシンボルを使うとよさげ。