Code Fix

初級

文字列の閉じクォート忘れによる SyntaxError

文字列を囲むクォートの片方を書き忘れると、それ以降のコードすべてが文字列の中身として読み込まれ続け、閉じクォートが見つからないままエラーになります。

エラーメッセージの読み方

main.rb:2: unterminated string meets end of file (SyntaxError)
main.rb
ファイル名
2
行番号 — Rubyが構文解析を諦めた位置
SyntaxError
エラー種別 — 実行前の構文チェックで検出されました
unterminated string meets end of file
内容 — 期待していたもの、または見つけられなかったもの

このエラーが出る典型パターン

パターン1

 1  greeting = "Good morning  
                             ^
 2  puts greeting
main.rb:2: unterminated string meets end of file (SyntaxError) puts greeting ^

文字列を開いたクォートは、閉じるまでずっと文字列の中身として読み込まれ続けます。改行を挟んでも同じです。

直し方: (空) を " にします。

この問題を解いてみる →

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

パターン2

 1  title = "Ruby Guide  
                        ^
 2  puts title.length
main.rb:2: unterminated string meets end of file (SyntaxError) puts title.length ^

閉じクォートが無いと、次の行のコードまで文字列の一部として飲み込まれ、ファイルの終わりでエラーになります。

直し方: (空) を " にします。

この問題を解いてみる →

パターン3

 1  message = "Task complete  
                             ^
 2  puts message
main.rb:2: unterminated string meets end of file (SyntaxError) puts message ^

エラーが指す行は文字列が始まった行ではなく、Rubyが読み込みを諦めた行です。直すべきは文字列が始まった行のクォートです。

直し方: (空) を " にします。

この問題を解いてみる →

パターン4

 1  note = "Meeting notes  
                          ^
 2  puts note.length
main.rb:2: unterminated string meets end of file (SyntaxError) puts note.length ^

文字列リテラルは開始と終了のクォートが1対1で対応していないと、構文として成立しません。

直し方: (空) を " にします。

この問題を解いてみる →

パターン5

 1  label = "Final version  
                           ^
 2  puts label.upcase
main.rb:2: unterminated string meets end of file (SyntaxError) puts label.upcase ^

クォートを閉じ忘れると、以降の行がどんどん文字列に取り込まれ、思わぬところでエラーになります。

直し方: (空) を " にします。

この問題を解いてみる →

よくある誤解

エラーが指す行にクォートを足しても直らないことがあります。本当に直すべきは、文字列が始まった行の閉じクォートです。

実務での勘所

引用符を大量に含む文字列を書きたい場合、Rubyには%q()や%Q()という代替のリテラル構文があります。%q{it's a "test"}のように、丸括弧・波括弧・角括弧など好きな区切り文字を選べるため、文字列の中身にクォートが多く含まれていても、エスケープや閉じ忘れを気にせずに書けます。%q(小文字)は式展開なし、%Q(大文字)は式展開ありという使い分けです。

演習をはじめる

関連するエラー

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