シンボル
シンボルとは、任意の文字列と一対一に対応するオブジェクトのこと。
シンボルの構文は、シンボルはコロン(:)に続けて任意の名前を定義する。
:シンボルの名前
(例)
:sushi
:ruby
:pen
シンボルと文字列の違い
:sushi.class # =>Symbol
'sushi'.class # =>String
シンボルはSymbolクラスのオブジェクト
文字列はStringクラスのオブジェクト
string = 'sushi'
string.upcase! # => "SUSHI"
# シンボルは、イミュータブルなので、破壊的な変更は不可能
symbol = :sushi
symbol.upcase! # => ruby.rb:5:in `<main>': undefined method `upcase!' for :sushi:Symbol (NoMethodError)
文字列は破壊的な変更が可能
シンボルは不可能
ミュータブルは、変更可能な
という意味で、
イミュータブルは、変更できない、不変の
という意味です。
文字列といった、ミュータブルなオブジェクトには破壊的な変更が適用できます。
しかし、
シンボルなどのイミュータブルなオブジェクトでは破壊的な変更が適用できません。
なので、シンボルは「何かに名前をつけたい、名前なので誰かによって勝手に変更されては困る」という用途に向いています。
◎イミュータブルなオブジェクトはデータ型で4種類
- 数値: integer・floatクラス
- シンボル: symbolクラス
- 真偽値: true,falseクラス
- nil: nilクラス
シンボルの特徴/ 主な用途
- 表面上は文字列っぽいので、プログラマにとって理解しやすい
- 内部的には整数なので、コンピュータは高速に値を比較できる
- 同じシンボルは同じオブジェクトであるため、メモリの使用効率が良い
- イミュータブルなので、勝手に値が変えられる心配がない
※ シンボルは同じシンボルであれば、全く同じオブジェクトであるという特徴があります。
このため、「大量の同じ文字列」と「大量の同じシンボル」を作成した場合、シンボルの方がメモリの使用効率が良くなります。
シンボルがよく使われるのは、ソースコード上では名前を識別できるようにしたいが、その名前が必ずしも文字列である必要がない場合です。
代表的な利用例は、ハッシュのキーです。
ハッシュのキーにシンボルを使うと、文字列よりも高速に値を取り出すことができます。