初級のRubyエラー 70問
14種類のエラーを、それぞれ複数パターンずつ収録しています。
- end忘れによる SyntaxError の原因と直し方def・if・class・while などのブロックはすべて end で閉じる必要があります。1つでも end を書き忘れると、Rubyはファイルの終わりに達するまで気づけず、末尾でエラーになります。
- 文字列の閉じクォート忘れによる SyntaxError文字列を囲むクォートの片方を書き忘れると、それ以降のコードすべてが文字列の中身として読み込まれ続け、閉じクォートが見つからないままエラーになります。
- 配列リテラルでカンマを付け忘れたときの SyntaxError配列の要素を並べる際、区切りのカンマを付け忘れると、次の要素が「予期しないトークン」として構文エラーになります。
- NameError: undefined local variable or method の原因と直し方宣言・代入していない変数名を参照したときに出るエラーです。変数名のタイプミスのほか、代入する前に参照してしまったときにも起こります。
- undefined method for nil の原因と直し方nilが入った変数に対してメソッドを呼び出そうとしたときに出るエラーです。値を取得し損ねた変数(見つからなかった検索結果など)をそのまま使うと、必ずここで止まります。
- 文字列と数値を + で連結すると TypeError になるRubyの+演算子は文字列同士、数値同士でしか使えません。文字列に数値を+で連結しようとすると、暗黙の型変換が行われずTypeErrorになります。
- ZeroDivisionError: divided by 0 の原因と直し方整数を0で割ると、ZeroDivisionErrorという例外が投げられプログラムが止まります。0で割られる可能性がある値は、事前にチェックする必要があります。
- 整数同士の割り算 / が小数にならず切り捨てられるRubyの/演算子は、両辺が整数の場合は商の整数部分だけを返します。小数点以下は切り捨てられ、割り切れなくても整数のままです。
- シングルクォートの文字列では #{} が展開されないダブルクォートの文字列内では#{式}がその評価結果に置き換わりますが、シングルクォートの文字列内では一切展開されず、そのままの文字として出力されます。
- 配列の範囲外アクセスはエラーにならず nil を返す存在しない添字で配列にアクセスしても、Rubyはエラーを出さずnilを返すだけです。その後nilに対してメソッドを呼び出すと、そこで初めてNoMethodErrorになります。
- ArgumentError: wrong number of arguments の原因と直し方メソッドが必要とする数と異なる数の引数を渡すと、ArgumentErrorになります。デフォルト値の無い引数を渡し忘れたり、余分な引数を渡したりすると発生します。
- メソッド名のタイプミスによる NoMethodError存在しない名前のメソッドを呼び出したときに出るエラーです。メソッド名を1文字でも間違えると、Rubyは似た名前を推測して実行してはくれず、その場でエラーになります。
- each は配列を変換しない(map との違い)eachブロックの中で要素を加工しても、eachの戻り値はレシーバ自身(変更前の配列)のままです。加工した結果からなる新しい配列が欲しい場合はmapを使う必要があります。
- if文の中で == のつもりで = を書くと常に真になるif文の条件に == の代わりに = を書くと、それは比較ではなく代入として実行されます。代入式の評価結果は代入した値そのものなので、0以外の値であれば条件は常に真になります。