Rubyのデータ型のうち、はじめのうちは少しわかりにくいのが文字列とシンボルの違いかもしれません。
Rubyにおける文字列
文字列は、"Hello World" といった文字の羅列で、これは誰にでもわかるでしょう。文字列は、見た目が同じでも、違うオブジェクトであることがありえます。
1 2 3 4 |
ms_suzuki = "Yoshiko" ms_takahashi = "Yoshiko" ms_suzuki.equal? ms_takahashi => false |
鈴木さん(ms_suzuki)と高橋さん(ms_takahashi)の下の名前はどちらも「Yoshiko」なので、各々の苗字を変数として、「Yoshiko」を代入しました。
2つの同じオブジェクトか同じであるかどうかを調べる「equal?」メソッドで調査すると、ms_suzukiとms_takahashiは、別々のオブジェクトであることがわかります。
同じオブジェクトとして扱いたい場合
しかし、実はこの二人が同じ人で、データ的にもそう処理したい場合はどうしたらよいでしょうか? 実はそんなときに使えるのがシンボルです。
Rubyにおけるシンボル
シンボルは、オブジェクト一つ一つにつける、世界に一つしかない「名札」のようなもので、シンボルが同じオブジェクトは、必ず同じオブジェクトになります。
シンボルは、「:」を使い以下のように書きます。
1 2 3 4 |
ms_suzuki = :Yoshiko ms_takahashi = :Yoshiko ms_suzuki.equal? ms_takahashi => true |
1行めと2行めで、ms_suzukiとms_takahashiに、同一のシンボル「:Yoshiko」を代入しています。この2つの変数は、「:Yoshiko」というシンボルが付けられたため、同じオブジェクトになります。
1 |
ms_suzuki.equal? ms_takahashi |
複数あると困るものはシンボルを使う
このことを利用して、「複数あっては困るもの」を指定するときに、Rubyではシンボルが積極的に使われます。たとえばハッシュでは、各要素のキーにシンボルを使います。
1 2 3 |
our_name= { :my_name => 'Ahiru', :his_name => 'Kitsune', :my_nephew => 'Yamori' } p our_name[:my_name] #=> "Ahiru" |
our_nameというハッシュには、「:my_name」の名札(シンボル)で登録されているデータは一つしかありません。つまりユニークキーになっていることが保証されているわけです。
通常の文字列とシンボル。似ているようで結構違います。Rubyのプログラムを書くときは、その違いを理解してうまく活用しましょう。