Code Fix

初級

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

演習をはじめる

関連するエラー

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