🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1525閲覧

undefined method `[]' for nil:NilClass (NoMethodError)

TKAilf

総合スコア3

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/02/06 00:24

前提・実現したいこと

エラーが出る原因が分かりません。
コードが正常に動く(最終的に 1 1 が検出される)ようにしたいです。

知りたいこと

Errorの解決方法または、参考となるようなものがないか

発生している問題・エラーメッセージ

test.rb:18:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)

該当のソースコード

board = [[".", ".", "."], [".", ".", "."], [".", ".", "."]] a = 0 b = 0 while board[a][b+1] == "." || board[a+1][b] == "." || board[a-1][b] == "." || board[a][b-1] == "." do if board[a][b+1] == "." while board[a][b+1] == "." do board[a][b] = "#" b += 1 end elsif board[a+1][b] == "." while board[a+1][b] == "." do board[a][b] = "#" a += 1 end elsif board[a][b-1] == "." while board[a][b-1] == "." do board[a][b] = "#" b -= 1 end elsif board[a-1][b] == "." while board[a-1][b] == "." do board[a][b] = "#" a -= 1 end end end puts "#{b} #{a}"

試したこと

  • エラー内容確認

Rubyのプログラムを実行するとundefined method '>' for nil:NilClass (NoMethodError)と出ます
undefined method '[]=' for nil:NilClass (NoMethodError) について

  • エラー文の前後をp boardで確認

エラー内容からおそらくboardがnilになっていると考え、p boardで異常がないか確認しましたが
特に問題ありませんでした。
また、a,bの変数も値が入力されていました。

while手前に p board 追加

elsif board[a+1][b] == "." p board while board[a+1][b] == "." do board[a][b] = "#" a += 1 end 出力結果 ["#", "#", "."], [".", ".", "."], [".", ".", "."]]

while後方に p board 追加

elsif board[a+1][b] == "." while board[a+1][b] == "." do board[a][b] = "#" a += 1 end p board 出力結果 なし

whileに p board 追加

elsif board[a+1][b] == "." while board[a+1][b] == "." do board[a][b] = "#" a += 1 p board end 出力結果 [["#", "#", "#"], [".", ".", "."], [".", ".", "."]] [["#", "#", "#"], [".", ".", "#"], [".", ".", "."]]

補足情報(FW/ツールのバージョンなど)

Ruby 2.5.8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2021/02/06 01:25 編集

どのようなことをなさりたいのでしょうか。また、どのような出力結果を望まれているのでしょうか。
TKAilf

2021/02/06 03:08

コードを実行した際に、出力結果が 1 1 となることを想定しております。
guest

回答1

0

ベストアンサー

エラー内容からおそらくboardがnilになっていると考え、

違います。
board[a+1]nilなので、それに[]を付けるboard[a+1][b]がエラーになっています。
boardの添え字は0,1,2である必要がありますが、a+1が3以上なのでしょう。

Rubyの配列は、範囲外の添え字を指定してもそれでエラーにはならず、nilを返します。

投稿2021/02/06 00:51

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TKAilf

2021/02/06 02:51

ご回答ありがとうございます。 疑問に思ったのですが、配列が仮にnilを返したとしても whileの条件式に等価演算子(==)を用いているので、whileのループから抜けるだけではないのでしょうか? ちなみに、p a やp board[a+1] で確認したところwhileの中でa=1,a=2の場合のみループしているみたいです。 上記から、おそらく otn様のおっしゃる通りa=3になった時に、エラーが出ている のだと思います。
otn

2021/02/06 03:01

> whileの条件式に等価演算子(==)を用いているので、whileのループから抜けるだけではないのでしょうか? それは、的外れだと思います。 board[a]、board[a+1]、board[a-1]などがnilでないという判断はどこでもされていません。
TKAilf

2021/02/09 02:20

時間が経ち申し訳ありません。 ありがとうございました。 >board[a]、board[a+1]、board[a-1]などがnilでないという判断はどこでもされていません。 whileの条件分に対する条件のようなものがなかったのですね... 全く頭にありませんでした、コード修正したところ正常に動くようになりました。 ありがとうございます! ベストアンサーとさせて頂きます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問