Code Fix

初級

シングルクォートの文字列では #{} が展開されない

ダブルクォートの文字列内では#{式}がその評価結果に置き換わりますが、シングルクォートの文字列内では一切展開されず、そのままの文字として出力されます。

なぜエラーが出ないのか

出力: 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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)