Ruby ERROR
Ruby IndexError の原因と解決法
Array#fetchで配列の範囲外のインデックスを指定すると発生するエラーです。配列のサイズと添字のずれが原因です。
このエラーメッセージ
IndexError: index 5 outside of array bounds: -3...3
原因
- 配列の要素数以上のインデックスをfetchで指定している
- インデックスが0始まりであることを忘れている(3要素の最後は[2])
- ループの回数や計算した添字が配列サイズを超えている
❌ エラーになるコード
NG
fruits = ["りんご", "みかん", "ぶどう"]
puts fruits.fetch(5) # 要素は3つ(0〜2)しかない
✅ 修正したコード
OK
fruits = ["りんご", "みかん", "ぶどう"]
puts fruits.fetch(2)
# 範囲外の可能性があるならデフォルト値を指定
puts fruits.fetch(5, "該当なし")
▶ 修正済みコードを実行エディタで開く
progoのRuby実行環境(インストール不要・登録不要)でその場で動作を確認できます。
解決のポイント
配列の添字は0始まりで、3要素なら有効なのは0〜2です。範囲外を指定する可能性があるならfetch(添字, デフォルト値)で代替値を返せます。fruits.sizeでサイズを確認し、if i < fruits.sizeのような範囲チェックを入れるのも確実です。
よくある質問
fruits[5] だとエラーにならない?
[]は範囲外に対してnilを返すためエラーになりません。その代わりnilに気づかず後続処理でNoMethodErrorになることがあります。
負のインデックスはどうなる?
-1が最後の要素を指します。3要素なら-3までが有効で、fetch(-4)はIndexErrorになります。