シングルクォートの文字列では #{} が展開されない
ダブルクォートの文字列内では#{式}がその評価結果に置き換わりますが、シングルクォートの文字列内では一切展開されず、そのままの文字として出力されます。
なぜエラーが出ないのか
出力: Hello, #{name}!
(エラーなし)- Rubyは何も報告しません。文法として正しいためです
出力: Hello, #{name}!- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 name = "Taro" 2 puts 'Hello, #{name}!' ^
出力: Hello, #{name}!
シングルクォートの文字列では#{}が展開されず、そのままの文字として出力されます。
直し方: 'Hello, #{name}!' を "Hello, #{name}!" にします。
広告
広告スロット(未設定)
パターン2
1 city = "Osaka" 2 puts 'I live in #{city}' ^
出力: 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}' を "Your score is #{score}" にします。
パターン4
1 item = "apple" 2 puts 'I bought an #{item}' ^
出力: 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}' を "Today is #{day}" にします。
よくある誤解
「クォートの種類はどちらでも同じ」という思い込みは誤りです。式展開を使いたい場合は必ずダブルクォート(またはヒアドキュメント)を使う必要があります。
まとめ
シングルクォートの文字列では #{} が展開されないは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。