こんにちは!Webコーダー・プログラマーの貝原(@touhicomu)です。
Rubyのシンボルと文字列の違いについてわからない、どっちでもいいなら文字列でもいいんじゃない?と思っていませんか?
シンボルとは文字列のようで文字列ではないものなのですが、この違いしっかりと認識しておくとシンボルと文字列の使い分けができるようになったり、わかりやすいコードがかけるようになります。
また、文字列よりシンボルを使ったほうがメリットがある場合もあります。
この記事では、Rubyのシンボルについて
- コロン記号「:」の意味
- シンボルとは?
- ハッシュのキーとして使用するシンボル
という基本的な内容から、
- ハッシュと文字列の違い
- シンボルを使用するメリット
などの応用的な使い方に関しても学習していきます。
そこで今回はシンボルと文字列の違いや使い方、メリットなどをわかりやすくご紹介していきたいと思います。
シンボルとは?
コロン記号はシンボルの意味
シンボルとは主に文字列にコロン記号「:」を前置して定義したものです。
ただし、文字列を””で囲む必要はありません。
コロン記号「:」が、文字列記号「””」の代わりに、「これはシンボルだよ」とRubyに知らせています。
たとえば、以下のサンプルコードで、文字列とシンボルを比較してみましょう。
オブジェクトのclassメソッドは、そのオブジェクトがどのクラスに属しているかの値を返します。
str = "string" #文字列 sym = :symbol #シンボル p str.class p sym.class
[実行結果]
String Symbol
以上のように、Rubyも「””」で囲まれている場合は文字列と判定し、コロン記号「:」で前置されている場合は「シンボル」であると判定しています。
前置コロンと後置コロンがある
前章で解説したとおり、コロン記号「:」を文字列に前置するとシンボルになります。
また、以降の章で解説しますが、コロン記号「:」を文字列に「後置」する場合もシンボルとなるケースもあります。
たとえば、ハッシュのキーとしてシンボルを使う際や、キーワード引数を使う際に、コロン記号「:」を後置します。
ただ、通常はコロン記号「:」を文字列に前置することシンボルになるものと考えられてかまいません。
シンボルはオブジェクトのひとつ
文字列に「:」を前置しただけなので、文字列とよく似ていますがメソッドなどの名前を識別するためのラベルをオブジェクト化したものです。
厳密に言えば全くの別物です。
文字列との違いについては下の章で詳しく説明していますので参考にしてみて下さい。
samurai /*文字列 :samurai /*シンボル
ハッシュのキーとして使用
シンボルはハッシュやアクセサ、ブロック引数などに使用されていますが、Rubyを学び始めた頃はハッシュでのキーとしてよく使用します。
意味のある名前をキーに設定したいときにシンボルを使用します。
キーにシンボルを使うことでプログラムの可読性があがり、コードの記述も簡単にすることができます。
文字列との違い
シンボルは値をもたない
文字列は文字列自体がデータとして扱われますが、シンボルそのものは値を持ちません。
そのため、文字列そのもののデータを必要としない場合にシンボルが使われています。
データに特定の意味を持たせる
Ruby内部の動きも文字列とは違います。
一度生成されるとシンボルがポインタとなり、複数回使用しても同じ領域を使用して値を扱うことができます。
文字列を使用した場合は宣言するたびに文字列の領域が生成されます。
また、シンボルは同一の名前であれば同じものとして扱われます。
逆に文字列は記述するたびに生成され、同じ名前であっても内部では違うものとして扱われます。
ではサンプルコードでその違いを検証してみましょう。
str1 = "samurai" str2 = "samurai" p str1.object_id p str2.object_id p str1.equal?(str2) #同じオブジェクトならtrue、別のオブジェクトならfalseを返します。
[実行結果]
23122440 23122420 false #同じidではなかった→文字列の場合2つのオブジェクトが作成されている
sym1 = :samurai sym2 = :samurai p sym1.object_id p sym2.object_id p sym1.equal?(sym2) #同じオブジェクトならtrue、別のオブジェクトならfalseを返します。
[実行結果]
892188 892188 true #同じidだった→シンボルの場合は1つしかオブジェクトが作成されていない
object_idメソッドを使うと、オブジェクトに割り当てられているidを確認できます。
文字列の場合は毎回オブジェクトが作られるので、同じ文字であっても違うidになります。
また、シンボルは同じ名前であれば、1つのところをから値を参照するだけなので、同じidになります。
シンボルのメリット
メモリ消費が少ない
上でも説明したように、シンボルは一度生成されると同じ領域をずっと使うことになるので、メモリがちょっとだけ節約できます。
ちなみに、文字列は使用するたびに違う領域を使用しますので毎回メモリ領域が必要になります。
可読性が上がる
ハッシュを作る際に簡単な記述で配列を作ることができます。
通常はハッシュを作る際に以下のように記述します。
dog = { "name" => "pochi", "kind" => "shibaken" }
しかし、シンボルを使うことでもっとシンプルにコードを書くことができるようになります。
#シンボルをキーにするときは「:」を文字列の後につけます。 dog = {name: "pochi", kind: "shibaken" }
見た目もスッキリするので何を書いているコードなのかわかりやすくもなります。
処理が高速になる
使用するたびに生成される文字列とは違い、シンボルは一度生成されると同じ領域に値を入れていくので文字列に比べて処理が高速になります。
これはシンボルが文字列ではなくデータの位置を示すポインタとして内部では動いているからです。
まとめ
いかがでしたでしょうか?
学習のポイントを振り返ってみましょう!
- 文字列にコロン記号「:」をつけると、シンボルの意味になる。ただし、文字列は「“”」で囲まなくていい。
- コロン記号「:」は前置したり、後置したりする場合がある。
- シンボルはオブジェクトの一つで、ハッシュのキーとしてよく使用する。
- 文字列とは違い、シンボルは値を持たない。
- シンボルはデータにポインタとしての意味を持たせるオブジェクト。
- シンボルのメリットとして、メモリを消費せず、可読性があがり、処理が高速になる。
文字列に比べてメモリ消費も少なく可読性もあがるのでぜひ活用してみてください。
Rubyを学習している時、始めの頃はハッシュによく使用されますので初心者の方もしっかりと理解しておきましょう。