文字列の閉じクォート忘れによる 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
^
クォートを閉じ忘れると、以降の行がどんどん文字列に取り込まれ、思わぬところでエラーになります。
直し方: (空) を " にします。
よくある誤解
エラーが指す行にクォートを足しても直らないことがあります。本当に直すべきは、文字列が始まった行の閉じクォートです。
まとめ
文字列の閉じクォート忘れによる SyntaxErrorは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。