Ruby の「文字列」と「シンボル」は、見た目が少し似ていても役割が違います。
文字列はテキストそのものを扱うためのオブジェクトで、シンボルは名前や識別子として使うためのオブジェクトです。
ここを整理しておくと、ハッシュのキー、メソッド名、設定値の扱いで迷いにくくなります。
文字列とは何か
Ruby の公式ドキュメントでは、String はテキストやバイナリデータを表すオブジェクトとして説明されています。
たとえば "あいうえお" や "manga" のようにダブルクオートやシングルクオートで書いた値は文字列です。
mojiretu = "あいうえお" puts mojiretu
このように、文字列は表示したり、連結したり、一部を取り出したりしながら「文字データ」として扱います。
String#[] を使えば、位置を指定して一文字や部分文字列を取り出せます。
mojiretu[0] # => "あ" mojiretu[1, 2] # => "いう"
文字列は変更できる
文字列の大きな特徴は、メソッドによって中身を変更できることです。
Ruby の公式ドキュメントでも、String#[]= や String#replace など、文字列を変更するメソッドが多数用意されています。
word = "manga" word[0] = "s" puts word # => "sanga"
このように、文字列は「表示するだけの固定値」ではなく、必要に応じて内容を書き換えながら使うことができます。
フォーム入力、メッセージ表示、ファイル名、URL の一部など、変化するテキストを扱う場面では文字列が自然です。
シンボルとは何か
一方でシンボルは、Ruby の公式ドキュメントで「テキストやデータではなく、識別子として使うためのオブジェクト」と説明されています。
:name や :age のように、コロンを付けて書く値がシンボルです。
a = :book b = "book"
見た目は少し似ていますが、:book は「book という名前を表す印」で、"book" は「book という文字列データ」です。
そのため、シンボルは設定項目の名前、ハッシュのキー、メソッド名のように、変化させずに識別子として扱いたい場面でよく使われます。
シンボルは文字列と同じようには書き換えられない
シンボルは識別子として使う前提なので、文字列のように [] = で一文字ずつ書き換えることはできません。
a = :book a[0] = "f"
このような代入は NoMethodError になり、文字列と同じ感覚では扱えません。
これは「シンボルは書き換えできない文字列」と雑に覚えるより、「シンボルは最初から文字列とは別物」と理解したほうが混乱しにくいです。
Ruby の String ドキュメントでも、文字列はテキストやデータ、シンボルは識別子という形で役割が分けられています。
文字列とシンボルの使い分け
実際の Ruby コードでは、次のように考えると分かりやすいです。
- ユーザーに見せる文字や文章は文字列
- 後から内容を変える可能性がある値は文字列
- 設定名やキー名のように名前として使う値はシンボル
- ハッシュのキーやメソッド名のような識別子はシンボル
user = {name: "Taro", age: 20}
user[:name] # => "Taro"
この例では、name や age は項目名なのでシンボル、"Taro" は実際の文字データなので文字列です。
もちろんハッシュのキーに文字列を使うこともできますが、Ruby ではシンボルがよく使われるので、まずはこの違いを押さえておくと読みやすくなります。
相互変換も覚えておくと便利
文字列とシンボルは別物ですが、必要に応じて変換できます。
"book".to_sym # => :book :book.to_s # => "book"
外部から受け取った文字列をキーとして扱いたいときや、シンボルを表示用に文字列へ戻したいときに役立ちます。
ただし、最初から何でも変換して使うより、その値が「文字データ」なのか「識別子」なのかを考えて型を選ぶほうがコードは分かりやすくなります。
まとめ
Ruby の文字列はテキストを扱うためのオブジェクトで、必要に応じて内容を書き換えられます。
シンボルはテキストそのものではなく、名前や識別子として使うためのオブジェクトです。
「表示する内容や変わる値は文字列」「項目名やキー名のような名前はシンボル」と考えると、Ruby のコードがかなり読みやすくなります。

