初心者が躓くRubyエラー集 Syntax Error

プログラミング

エラーを制すればプログラミングを制します。

こんにちは、元シリコンバレーエンジニアの五石です。

プログラミング学習中にエラーが出ると、プログラミングって難しくてやる気なくなりますよね?

ですが、

エラーは「何故そのコードが動かないのか」を詳しく教えてくれている友達なのです。

なので、仲良くしましょう。

ということで、今回はRubyのエラーをなるべく読めるようにする初心者がつまづきやすいエラーの一つ、

Syntax Error 説明したいと思います。

Syntax Error は Rubyの構文のルールにエラーが有った際に表示されます。

ダブルクオーテーション(”)の数が合わない

まず、こちらのコードを御覧ください。

puts "Hello World"

これは、プログラミングを始めた方なら見たことはあると思います。

「Hello World」という文字をコンソールに表示するコードですね。

こちらのコードが

puts "Hello World

となっていたら、エラーが起きます。エラーの内容をみましょう。

test.rb:2: unterminated string meets end of file

これはRubyファイルにコードを書いて実行した結果です。

細かくエラーを見ていきましょう。

まず、はじめの

「test.rb」は僕が適当に作ったファイルの名前です。エラーが有ったファイルを指してます。

「test.rb:2: 」は二行目でプログラミングがクラッシュしたことを示してます。

よって、実際のエラー文は

unterminated string meets end of file」

となっており、これをグーグル翻訳に訳すと

「終了していない文字列がファイルの終わりを満たしています」

となっています。

それではなぜ「終了していない文字列」という言葉が出てきているのでしょうか?

みなさん、ご存知の通り文字列は ダブルクオーテーション(”)で囲みます

"Hello World"

ですが、今回は文字列をとじるためのダブルクオーテーションがありません。

なので、このプログラムを読んだ際にはじめにダブルクオーテーション(”)があれば、もう一方のダブルクオーテーション(”)があるはずと思います。

ですが、もう一方のダブルクオーテーション(”)が見つからないで最後のファイルの終わりまで来てしまったので、

ファイルの終わりを満たしています」と言われるわけです。

ここではグーグル翻訳なので少し言葉が変ですが、

「終了していない文字列のままファイルの終わりまで来た」と言った意味になります。

endの数が足りない

続いてこちらのコードを見ていきましょう。

array = [1,2,3,4,5]

array.each do |num|
  puts num

これは 1〜5の数を表示させるためのコードですが

eachのendが足りていません。

このコードを実行すると

test.rb:5: syntax error, unexpected end-of-input, expecting end

と出ます。

これをグーグル翻訳で約してもよくわからない日本語になるので、一個ずつ英語を読んでいきましょう。

構文エラー、予期しない入力の終了、予期しない終了

Syntax Errorが「構文エラー」で、

unexpected end-of-input が 予期しない 「end-of-input」 ということになります。

end-of-inputは「終了するための入力」という意味として捉えてください。

Rubyのプログラミング言語で言えば、「end」がその代表例です。

expecting endは「endを予想していた」

とあります。なんとなく意味はわかるでしょうか?

意訳してみると「endを予想していたのにそれ以外のだった」と言った意味でしょうか。

イマイチ、ピンと来ていない人は

「syntax error, unexpected end-of-input, expecting end」

この1文をまるまる覚えてしまって、これがあればendが抜けていると

考えていもいいと思います。

このエラーは初心者のうちはかなり頻出するので、覚えておきましょう。

コードのインデント(左の空白)をしっかり揃えると、どこが抜けているかわかりやすくなり

このエラーは数が減るので常にインデントは揃えるようにするといいです。

この記事を書く際に、他に初心者の方がどのようなエラーをしやすいか調べていたところ

確かにあるあるのものを見つけました。みなさん、こちらのエラーを解決できるでしょうか?

class UsersController < ApplicationController

  def new
    @user = User.new
  end

  def create
  end

  def show
    @user = User.find_by(id: params[:id])
  end
end
SyntaxError: ・・・users_controller.rb:13: syntax error, unexpected end, expecting end-of-input

というエラーです。

これは

SyntaxErrorが解決できない。。|teratail
前提・実現したいことendの位置や数はあっていると思うんですが、SyntaxErrorが出て困っています。 発生している問題・エラーメッセージSyntaxError: ・・・users_controller.rb:13: syntax error, unexpected end, expectin

こちらの質問で、全角スペースがdef createの間に入っているというものでした。

全角スペース関連のエラーはかなり多いので、こちらの回答にあるように

全角スペースを見えるようにするエディタの設定に変えたほうがいいです。

コメント

タイトルとURLをコピーしました