【Ruby】における「文字列」と「シンボル」とは何なのか?

  • URLをコピーしました!

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"

この例では、nameage は項目名なのでシンボル、"Taro" は実際の文字データなので文字列です。

もちろんハッシュのキーに文字列を使うこともできますが、Ruby ではシンボルがよく使われるので、まずはこの違いを押さえておくと読みやすくなります。

相互変換も覚えておくと便利

文字列とシンボルは別物ですが、必要に応じて変換できます。

"book".to_sym # => :book
:book.to_s    # => "book"

外部から受け取った文字列をキーとして扱いたいときや、シンボルを表示用に文字列へ戻したいときに役立ちます。

ただし、最初から何でも変換して使うより、その値が「文字データ」なのか「識別子」なのかを考えて型を選ぶほうがコードは分かりやすくなります。

まとめ

Ruby の文字列はテキストを扱うためのオブジェクトで、必要に応じて内容を書き換えられます。

シンボルはテキストそのものではなく、名前や識別子として使うためのオブジェクトです。

「表示する内容や変わる値は文字列」「項目名やキー名のような名前はシンボル」と考えると、Ruby のコードがかなり読みやすくなります。


目次