調べた経緯
ワークにて、ループ処理をネスト(入れ子)にすることがあり、各制御構造について調べたのでここに記しておきます。
特に悩んだのはnextってなんだ? という疑問で、調べたのですが、検索結果はeach文に対するものが多く、理解するのに苦労しました。
あまり使用する機会はないかと思いますが、while文のループのネストで説明したいと思います。
これが理解できたことで、自分はeach文でのnextもなんとなく理解が深まりました。
各制御構造
-
break
公式リファレンス
break はもっとも内側のループを脱出 -
return
公式リファレンス
メソッド自体から抜ける。 -
next
公式リファレンス
nextはもっとも内側のループの次の繰り返しにジャンプします。??
実際の挙動
このもっとも内側のループの次の繰り返しにジャンプが上手く理解できず色々と挙動を確認した。
※冒頭で述べたがeach文での説明が多い。
#ループ1
while true
puts "ループ1"
#ループ2
while true
puts "ループ2"
#ループ3
while true
puts "ループ3"
n = gets.to_i
if n == 1
puts "続いてからループするよ"
elsif n == 2
puts "このループ内の残りの処理をスキップしてループ(3の頭に戻る)するよ"
next
elsif n == 3
puts "このループからは抜けるよ"
break
else
puts "すべてのループ(メソッド)を終わりにするよ"
return
end
puts "ループ3の終わり"
end
puts "ループ2の終わり"
break
end
puts "ループ1の終わり"
return
end
前提として、起動すると、一番内側のループ3まで行きます。
- 1を実行 処理なし
続いてからループするよ
ループ3の終わり
ループ3
if文を抜けて、ループ3の終端まで実行されたあと、while文のループが継続し、元の位置に戻ります。
- 2を実行 next
このループ内の残りの処理をスキップしてループ(3の頭に戻る)するよ
ループ3
ループ3の終端までいかず、即座に3のループを再開しました。
- 3を実行 break
このループからは抜けるよ
ループ2の終わり
ループ1の終わり
3のループを抜け、2の終端まで行き、2の終端にあるbreak文でさらに抜け、1の終わりまで到達しています。
- 4(1と2と3以外) return
全てのループ(このメソッド)を終わりにするよ
3のループ内にいながら、2と1のループも全て実行されずに終了されました。
結論
breakはそのループのみから抜ける
ネスト(入れ子)なら内側のループから抜け,外のループに出る。
returnは、メソッド内の処理から抜ける
そのメソッド内で、ループの入れ子であろうが、処理は終了する
nextはそのループ内の残りの処理をスキップして現在のループ内の頭に戻る
その中の処理をスキップする、ループ自体は継続する
どうでしょうか? 初学者なりにまとめてみたつもりですが、誰かの参考に少しでもなれたなら幸いです。