文字列は可変な文字列シーケンスであり、シンボル(:name)は不変のインターン化された識別子です。同じシンボルはメモリ内で常に同じオブジェクトです。シンボルは軽量で効率的な識別子(特にハッシュキー)として使われ、文字列は実際のテキストデータを保持します。
核となる違い:同一性と可変性
.object_id == .object_id
<<
.object_id == .object_id
.frozen?
すべての文字列リテラルは新しいオブジェクトを作成しますが、シンボルはインターン化されています — :helloは何回出現しても常にメモリ内で同じオブジェクトです。シンボルはまた不変です。
Strings: each "name" allocates a new object → more memory, slower comparison (char by char)
Symbols: :name is ONE shared object → memory-efficient, fast comparison (by identity)
→ Symbols are ideal as identifiers used repeatedly (hash keys, method names, options).
# SYMBOLS — for identifiers: hash keys, method names, options, fixed labels
user = { name: "Ann", role: :admin } # symbol keys (the idiom)
send(:upcase) # method name as a symbol
status = :active # a fixed label/state
# STRINGS — for actual text DATA that you display, manipulate, or that varies
name = "Ann Smith" # real text content
message = "Hello, #{name}" # building/interpolating text
user_input = gets.chomp # data from outside
識別子にはシンボルを使用(ハッシュキー、オプション名、状態、メソッド名 — 固定された繰り返されるラベル)し、実際のテキストデータには文字列を使用(表示するコンテンツ、操作するコンテンツ、またはユーザーからのコンテンツ)してください。
"hello".to_sym # :hello
:hello.to_s # "hello"
文字列とシンボルの区別を理解することは重要です。シンボルは多くの他の言語には存在しない機能であり、適切に使用することはイディオマティックなRubyです。
核となる違いは、シンボルはインターン化されて不変(:nameは常にメモリ内で同じ単一オブジェクトであり、不変)であり、文字列は可変でありリテラルごとに新しいオブジェクトであることです。
これにより、シンボルは識別子としてメモリとパフォーマンスの利点を得ます:1回割り当てられて共有され(繰り返し使われるときメモリ効率が良い)、文字ごとの比較ではなく同一性で比較されます(高速)。
実践的なガイドライン — 識別子にはシンボルを使用(ハッシュキー、メソッド名、オプションラベル、固定状態 — ラベルとして繰り返し使われるもの)し、実際のテキストデータには文字列を使用(表示するコンテンツ、操作するコンテンツ、またはユーザーから受け取るコンテンツ)— はイディオマティックなRubyとしてパフォーマンスと明確性の両方に影響します。
シンボルハッシュキー({ name: "Ann" })はRubyとRailsの慣例であり、固定識別子に文字列ではなくシンボルを使用することは効率的で慣例的です。
いつ各々を使用するか、シンボルのインターン化と不変性、そして識別子としてのそれらの効率性を理解することは基本的で頻繁に応用されるRubyの知識です — 新規学習者にとって混乱の一般的なポイント(なぜ両方あるのか?)であり、区別を理解する(シンボルは効率的なインターン化された識別子、文字列は可変なテキストデータ)ことはイディオマティックで効率的なRubyを書くのに必須であり、この独特なRuby機能の理解を反映する頻繁な面接トピックです。