Rubyにおける「シンボル」
今回は、シンボルについてです。
Rubyにおける「シンボル」とは何なのか?
公式ドキュメントでは次のように説明されています。
シンボルを表すクラス。シンボルは任意の文字列と一対一に対応するオブジェクトです。文字列の代わりに用いることもできますが、必ずしも文字列と同じ振る舞いをするわけではありません。同じシンボルは必ず同一のオブジェクトです。
文章を読んでもいまいち理解できません。
シンボルと文字列は見た目にはよく似ています。
ですが、両者は基本的に別物です。
シンボルは次のようにコロン( : )に続けて任意の名前を定義します(シンボルリテラル)。
:シンボルの名前
[シンボルと文字列の違い]
- シンボルは、Symboljクラスのオブジェクト
- 文字列は、Stringクラスのオブジェクト
- シンボルの特徴
シンボルはRubyの内部で整数として管理されます。表面的には文字列と同じように見えますが、その中身は整数です。そのため、2つの値が同じかどうか調べる場合、文字列よりも高速に処理できます。
次に、シンボルは「同じシンボルであれば全く同じオブジェクトである」という特徴があります。このため、「大量の同じ文字列」と「大量の同じシンボル」を作成した場合、シンボルの方がメモリの使用効率がよくなります。
シンボルの特徴をまとめると次のようになります。
- 表面上は文字列っぽいので、プログラマにとって理解しやすい
- 内部的には整数なので、コンピューターは高速に値を比較できる
- 同じシンボルは同じオブジェクトであるため、メモリの使用効率が良い
- イミュータブルなので、勝手に値が変えられる心配がない
シンボルがよく使われるのは、ソースコード上では名前を識別できるようにしたいが、その名前が必ずしも文字列である必要はない場合です。
代表的な利用例はハッシュのキーです。ハッシュのキーにシンボルを使うと、文字列よりも高速に値を取り出すことができます。
他にも、オブジェクトが持っているメソッド名がシンボルで管理されたりします。
シンボルは登場する機会が多いので、Rubyがどういう用途でシンボルを使っているのか注目してみるのもいいかもしれません。