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
defで始めたメソッド定義はendで閉じる必要があります。Rubyはファイルの終わりに達するまで、endが足りないことに気づけません。
直し方: (空) を end にします。
パターン2
1 score = 80 2 if score >= 60 3 puts "pass" 4 ^ 5 6 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
クラスの中のメソッド定義にも個別にendが必要です。外側のclass用endとは別物です。
直し方: (空) を end にします。
パターン4
1 i = 0 2 while i < 3 3 puts i 4 i += 1 5 ^ 6 7 puts "finished"
whileループもendで閉じます。ループ本体が1行でも省略はできません。
直し方: (空) を end にします。
パターン5
1 [1, 2, 3].each do |n| 2 puts n 3 ^ 4 5 puts "done"
do...endのブロックもendで閉じる必要があります。{ }形式のブロックとは閉じ方が違うので注意してください。
直し方: (空) を end にします。
よくある誤解
エラーが指す行はファイルの最終行ですが、そこに end を足しても直らないことがあります。本当に足りないのは、対応する end を書き忘れたブロックの位置です。
実務での勘所
Rubyがend専用の単語で明示的にブロックを閉じる設計にしているのは、開発者Matzが英語の文章に近い読みやすさを重視したためです。波括弧よりendのほうが「ここで終わり」という意図が視覚的に伝わりやすいという判断でした。ただしその代償として、視覚的な目印が波括弧ほど機械的に強調されにくいという弱点もあります。RuboCopのような静的解析ツールは、インデントの深さとendの対応が崩れていないかを検査する機能を持っており、大きなコードベースではこうしたツールに頼るのが実務的です。