繰り返し処理を行う上で、ある一定条件の場合処理をスキップするために利用出来るのが「next」です。
本記事では、Rubyの制御構文「next」の使い方から他の制御構文との違いについてご紹介していきます。
nextとは
nextは制御文の1つで、繰り返し処理の中で実行されることで、該当ブロックの後続処理をスキップし次の繰り返し処理が開始されます。
記述法
繰り返し処理の中で「next」と記述するだけで後続処理がスキップされます。
for ... 処理1 if 条件式 next end 処理2 end
上記の記述では、条件に該当して「next」が実行された場合、「処理2」に関しては実行されず次の繰り返し処理に移ります。
繰り返しのスキップは該当ブロックのみ
繰り返し処理がネストしている場合、「next」が適用されるのは該当ブロックの繰り返し処理のみとなります。
for ... // 1つ目のループ 処理1 if 条件式 next end 処理2 for ... // 2つ目のループ 処理3 if 条件式 next end 処理4 end end
2つ目のループの「next」が実行された場合、あくまで「処理4」がスキップされるだけで1つ目のループまでスキップするわけではありません。
Rubyの各種繰り返し処理でnextの動きを確認
Rubyには繰り返し処理として「for」「each」「loop」「while」「times」といった各種処理が存在します。
それぞれの繰り返し処理でnextを記述して処理内容を確認してみましょう。
for
for文で「next」を実行するサンプルが下記です。
for ii in 1..5 do if ii == 3 next end p ii end
実行結果が下記です。
1 2 4 5
サンプルのfor文では「1~5」の範囲で繰り返し処理が実施され、「3」の場合だけコンソール出力処理をスキップしています。
each
each文で特定の文字列の場合「next」でスキップするサンプルが下記です。
animals = ["さる", "とり", "いぬ"] animals.each do |animal| if animal == "いぬ" next end p animal end
実行結果が下記です。
"さる" "とり"
繰り返し処理の最後で「next」が実行された場合、そのまま処理が終了することになります。
loop
「loop」では終了条件のない繰り返し処理を実施することができ、下記のサンプルでは10までの数値を順番にコンソール出力するサンプルです。
num = 0 loop do num += 1 if num == 3 next elsif num > 10 break end p num end
実行結果が下記です。
1 2 4 5 6 7 8 9 10
条件として「3」の場合のみ「next」による繰り返し処理のスキップが実施されるため、コンソールには出力されません。
while
whileでは終了条件を指定して繰り返し処理を実施することが可能です。
num = 0 while num < 10 do num += 1 next if num.even? p num end
実行結果が下記です。
1 3 5 7 9
サンプルでは、「num」の値が偶数の場合「next」により処理をスキップするため、奇数の値だけがコンソール出力されます。
times
timesでは指定した回数分繰り返し処理が実行されます。
5.times do |num| if num == 2 next end p num end
実行結果が下記です。
0 1 3 4
「times」では指定した回数繰り返し処理が実施され、「|num|」と指定した変数が「0」から繰り返し毎に「1」ずつ加算されます。
サンプルでは変数numが「2」の場合処理がスキップされるため、コンソールには上記のような出力となります。
ネスト
最後にネストしたループ処理での動きも確認しておきましょう。
for i in 1..5 p "外側のループ" + i.to_s + "回目" for ii in 1..3 if ii == 2 next end p "内側のループ" + ii.to_s + "回目" end end
実行結果は下記です。
"外側のループ1回目" "内側のループ1回目" "内側のループ3回目" "外側のループ2回目" "内側のループ1回目" "内側のループ3回目" "外側のループ3回目" "内側のループ1回目" "内側のループ3回目" "外側のループ4回目" "内側のループ1回目" "内側のループ3回目" "外側のループ5回目" "内側のループ1回目" "内側のループ3回目"
next以外の制御構文との違い
Rubyで利用可能な繰り返し処理の制御構文として「next」以外にも「break」「redo」の存在が挙げられます。
それぞれの処理の違いについて確認しておきましょう。
break
breakは繰り返し処理を中断させるために利用します。
for i in 1..3 if i == 2 break end p i.to_s + "回目" end
実行結果が下記です。
"1回目"
for文では「1~3」までの間ループすると記述していますが、2回目の処理で強制的に繰り返し処理を中断するように「break」を記述しているため、サンプルのようなコンソール出力となります。
また繰り返し処理がネストしている場合、「break」を記述したブロックの繰り返し処理のみを中断します。
for i in 1..3 p "外側のループ" + i.to_s + "回目" for ii in 1..3 if ii == 2 break end p "内側のループ" + ii.to_s + "回目" end end
実行結果が下記です。
"外側のループ1回目" "内側のループ1回目" "外側のループ2回目" "内側のループ1回目" "外側のループ3回目" "内側のループ1回目"
内側のループでは繰り返しの2回目に必ず処理を抜けるように記述しているため、上記のような出力結果となります。
redo
「redo」では再度同じ繰り返し処理を実施します。
num = 0 animals = ["さる", "とり", "いぬ"] animals.each do |animal| num += 1 if num == 2 redo end p animal + "が実行された際のnumの値は" + num.to_s + "です。" end
実行結果が下記です。
"さるが実行された際のnumの値は1です。" "とりが実行された際のnumの値は3です。" "いぬが実行された際のnumの値は4です。"
元々「さる→とり→いぬ」の順番で繰り返し処理が実施されるはずでしたが、「redo」を使用したことにより「さる→とり→とり→いぬ」の繰り返しとなりサンプルのような出力結果となります。
さいごに: Rubyのnextを使いこなして繰り返し処理を制御しよう
本記事では、Rubyの制御構文である「next」の使い方をサンプルコードを掲載しながらご紹介してきました。
「next」などの制御構文は「if」による条件式と合わせて利用することになります。
それぞれの繰り返し処理や制御構文の違いを把握して、適切な処理を実現出来るように学習していきましょう。
loop処理は「break」で処理を中断させないと無限ループとなるため注意が必要です。