end忘れによる SyntaxError の原因と直し方
def・if・class・while などのブロックはすべて end で閉じる必要があります。1つでも end を書き忘れると、Rubyはファイルの終わりに達するまで気づけず、末尾でエラーになります。
エラーメッセージの読み方
main.rb:5: syntax error, unexpected end-of-input, expecting `end' or dummy end (SyntaxError)
main.rb- ファイル名
5- 行番号 — Rubyが構文解析を諦めた位置
SyntaxError- エラー種別 — 実行前の構文チェックで検出されました
syntax error, unexpected end-of-input, expecting `end' or dummy end- 内容 — 期待していたもの、または見つけられなかったもの
このエラーが出る典型パターン
パターン1
1 def greet 2 puts "hi" 3 ^ 4 5 greet
main.rb:5: syntax error, unexpected end-of-input, expecting `end' or dummy end (SyntaxError)
greet
^
defで始めたメソッド定義はendで閉じる必要があります。Rubyはファイルの終わりに達するまで、endが足りないことに気づけません。
直し方: (空) を end にします。
広告
広告スロット(未設定)
パターン2
1 score = 80 2 if score >= 60 3 puts "pass" 4 ^ 5 6 puts "done"
main.rb:6: syntax error, unexpected end-of-input, expecting `end' or dummy end (SyntaxError)
puts "done"
^
if文もendで閉じます。中カッコを使わないRubyでは、endの有無だけがブロックの境界を示します。
直し方: (空) を end にします。
パターン3
1 class Dog 2 def bark 3 puts "woof" 4 ^ 5 end 6 7 Dog.new.bark
main.rb:7: syntax error, unexpected end-of-input, expecting `end' or dummy end (SyntaxError)
Dog.new.bark
^
クラスの中のメソッド定義にも個別にendが必要です。外側のclass用endとは別物です。
直し方: (空) を end にします。
パターン4
1 i = 0 2 while i < 3 3 puts i 4 i += 1 5 ^ 6 7 puts "finished"
main.rb:7: syntax error, unexpected end-of-input, expecting `end' or dummy end (SyntaxError)
puts "finished"
^
whileループもendで閉じます。ループ本体が1行でも省略はできません。
直し方: (空) を end にします。
パターン5
1 [1, 2, 3].each do |n| 2 puts n 3 ^ 4 5 puts "done"
main.rb:5: syntax error, unexpected end-of-input, expecting `end' or dummy end (SyntaxError)
puts "done"
^
do...endのブロックもendで閉じる必要があります。{ }形式のブロックとは閉じ方が違うので注意してください。
直し方: (空) を end にします。
よくある誤解
エラーが指す行はファイルの最終行ですが、そこに end を足しても直らないことがあります。本当に足りないのは、対応する end を書き忘れたブロックの位置です。
まとめ
end忘れによる SyntaxErrorは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。