Rubyで多いのがendの数の間違いです。def・if・doに対してendが足りない/多いと起きます。
end の不足end が多すぎるdef greet(name)
puts "Hello, #{name}"
greet("progo")
def greet(name)
puts "Hello, #{name}"
end
greet("progo")
▶ 修正済みコードを実行エディタで開く
def・if・while・doには必ず対応するendが要ります。開始キーワードとendの数を数えましょう。インデントを揃えると対応が一目で分かります。
末尾の文言で「endが足りない」のか「endが多い」のかが分かります。方向を間違えると延々見つかりません。
| メッセージ | 意味 | 探し方 |
|---|---|---|
unexpected end-of-input, expecting `end' | endが足りない | def・if・do・class を数えて足す |
unexpected `end' | endが多すぎる | 余分なendを削る |
unterminated string meets end of file | 文字列の"を閉じていない | 引用符の対応を確認 |
can't find string "EOS" anywhere before EOF | ヒアドキュメントの終端が無い | 終端行の前後の空白・インデントを確認 |
unexpected ')' / unexpected ',' | カッコ・カンマの過不足 | 示された行の直前を見る |
ruby -c で構文だけチェックする実行せずに構文だけ検査できます。Syntax OKと出ればendの対応は取れています。編集のたびに走らせるのが最短ルートです。
$ ruby -c app.rb
app.rb:5: syntax error, unexpected end-of-input, expecting `end'
$ ruby -wc app.rb # 未使用変数などの警告も一緒に出す
Ruby 3.2以降はdid_you_meanやerror_highlightが有効で、対応の取れていないdefやifの行を指し示してくれます。Rubyのバージョンが古い場合はrubocopやruby -cを併用してください。
「endが足りない」と言われても、どのキーワードの分が足りないのかが分からないと直せません。多い順に5つ挙げます。
endを書き忘れる。最頻出elsifを追加した流れで抜ける。caseはwhenがいくつあってもendは1つeach do |x|に対するend。{ }ブロックと混在すると特に見落としやすいendが1つ足りないと最終行でエラーになるend不足になるclass User
def initialize(name)
@name = name
end
def greet
[1, 2, 3].each do |i|
puts "#{i}: #{@name}"
# ← doに対応するendが無い
end
end
OK
class User
def initialize(name)
@name = name
end
def greet
[1, 2, 3].each do |i|
puts "#{i}: #{@name}"
end
end
end
User.new("progo").greet
▶ 修正済みのクラス例を実行エディタで開く
逆にendが余るとsyntax error, unexpected `end', expecting end-of-inputになります。多いのは次の2つです。
if(puts x if x > 0)や三項演算子にendを付けてしまった{ }ブロックをendで閉じようとした(each { |x| ... }にendは不要)[1, 2].each { |i| puts i }
end # ← 余分
puts "done" if true
end # ← 後置ifにendは不要
Rubyはendの位置を構文的に強制しないため、インデントを揃えることが唯一の目視チェック手段になります。次の手順で機械的に見つかります。
rubocop -aやエディタの整形機能)def・if・while・do・class・moduleとendを同じ列に揃えるend、または対になる相手が無い開始キーワードがそこが原因ruby -cし、二分探索で範囲を絞るエラー行として報告されるのは多くの場合ファイルの最終行です。Rubyは最後まで読んでから「終わってしまった」と判断するため、最終行の番号は原因の場所ではありません。上へさかのぼって探してください。
検索でたどり着いた方向けに、よく似た文言のエラーを挙げておきます。言語が違えば原因も変わります。
Parse error: syntax error, unexpected end of file → 波カッコの閉じ忘れSyntaxError: Unexpected end of input → Unexpected token / end of inputIndentationError・SyntaxError → インデントのずれsyntax error at end of input → クエリが途中で切れている(プレースホルダの数違いなど)