シングルクォートの文字列では #{} が展開されない
ダブルクォートの文字列内では#{式}がその評価結果に置き換わりますが、シングルクォートの文字列内では一切展開されず、そのままの文字として出力されます。
なぜエラーが出ないのか
出力: Hello, #{name}!
(エラーなし)- Rubyは何も報告しません。文法として正しいためです
出力: Hello, #{name}!- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 name = "Taro" 2 puts 'Hello, #{name}!' ^
シングルクォートの文字列では#{}が展開されず、そのままの文字として出力されます。
直し方: 'Hello, #{name}!' を "Hello, #{name}!" にします。
パターン2
1 city = "Osaka" 2 puts 'I live in #{city}' ^
変数の値を埋め込みたい場合は、必ずダブルクォートかヒアドキュメントを使う必要があります。
直し方: 'I live in #{city}' を "I live in #{city}" にします。
パターン3
1 score = 95 2 puts 'Your score is #{score}' ^
クォートの種類を間違えても構文エラーにはならず、意図しない文字列がそのまま出力されます。
直し方: 'Your score is #{score}' を "Your score is #{score}" にします。
パターン4
1 item = "apple" 2 puts 'I bought an #{item}' ^
エラーが出ないため、出力を目で確認しない限りこのミスには気づきにくいです。
直し方: 'I bought an #{item}' を "I bought an #{item}" にします。
パターン5
1 day = "Monday" 2 puts 'Today is #{day}' ^
式展開はダブルクォートの中でだけ有効な機能です。シングルクォートは常に文字通りの文字列になります。
直し方: 'Today is #{day}' を "Today is #{day}" にします。
よくある誤解
「クォートの種類はどちらでも同じ」という思い込みは誤りです。式展開を使いたい場合は必ずダブルクォート(またはヒアドキュメント)を使う必要があります。
実務での勘所
シングルクォートの制限は式展開(#{})だけにとどまりません。バックスラッシュによるエスケープシーケンスもほとんど解釈されず、'\n'は改行文字ではなく、バックスラッシュとnという2文字そのものとして扱われます。シングルクォートの中で特別な意味を持つのは\\(バックスラッシュ自身)と\'(クォート自身)の2つだけです。改行やタブなどの制御文字を文字列に含めたい場合は、必ずダブルクォートを使う必要があります。