Search

検索したいワードを入力してください

2019年04月22日

Rubyのブロックで使うnextメソッドの特徴と方法を解説

Rubyの「next」メソッドの特徴と基本的な使い方について説明しています。特に「for」「while」「each」「times」といった繰り返し処理で、連続処理を止めずにある条件成立時のみ処理をスキップしたい場合の使い方について、具体的な例を挙げ説明します

Rubyのnextメソッドとは

この記事では、Rubyのnextメソッドの特徴と基本的な使い方について説明していきます。

データを読み出したりする時、あるいは出力したりする時に「for」「while」「each」「times」といった繰り返し処理を使いますが、その繰り返し処理の連続処理実行中、ある条件が成立した時のみ処理をスキップしたい場合に、このnextメソッドが効力を発揮します。

連続データを読み取る際、ある不必要なデータのみ判別し読み取らないようにするといった場合に使うことができます。繰り返し処理の方法と条件の設定の仕方、その時の処理方法によりいろいろな使い方ができます。

また、繰り返し処理の途中で処理を終了したい場合の「break」メソッドやリトライ処理の「redo」メソッドとの比較を通してその特徴を説明していきます。

nextメソッドの特徴と基本的な使い方

Rubyの「next」メソッドの特徴は、繰り返し処理(for,while,each,timesメソッド)で、連続処理を止めずにある条件の時だけ処理を「次」(next)へスキップすることができます。

例えば「1から7までを連続出力をしたいが、5の時だけ出力をしたくない」などといった場合に使われます。「for」による繰り返し処理の例を示します。
<Rubyプログラム>
for i in 1..7
if i==5 then
next
end
puts i
end


「for i 」 から最後の「end」までの繰り返し処理がスタートします。iが「1」からスタートし「7」まで繰り返して「puts i」を実行して出力します。

ステップが進み、条件文「i == 5」の時に「next」(スキップ)が実行され、次のステップへジャンプします。つまりこのステップの「puts i」が実行されず「5」が出力されません。
<出力>
1
2
3
4        
6           
7

次に「while」による繰り返し処理ブロックの例を示します。
<Rubyプログラム>
a = 0
while(a < 8) do      
a += 1      
if a == 5 then      
next      
end           
puts a            
end


「while(a < 8) do 」 から最後の「end」までの繰り返し処理がスタートします。aが「1」からスタートし「<8(8以下)」、つまり「7」まで繰り返して「puts a」を実行して出力します。

ステップが進み、条件文「a == 5」の時に「next」(スキップ)が実行され、次のステップへジャンプします。つまりこのステップの「puts a」が実行されず「5」が出力されません。
<出力>
1
2
3
4        
6           
7
先ほどの「for」の場合と同じ出力結果となります。

nextメソッドの特徴

「for」や「while」の例で見たように、繰り返し処理の中で、ある条件の時のみ実行される処理に「next」メソッドを記述することで繰り返し処理をスキップさせ、次のステップの繰り返し処理を継続して実行させることができます。

このように、「next」メソッドにより、ある条件の時のみ繰り返し処理をスキップし、繰り返し処理はそのまま継続できることが大きな特徴です。

これに対し、ある条件を満たしたら繰り返し処理を終了する場合は、「next」メソッドの代わりに「break」メソッドを使用します。
<Rubyプログラム>
a = 0
while(a < 8) do      
a += 1      
if a == 5 then      
break      
end           
puts a            
end


この場合の出力は、
<breakメソッドの場合の出力>
1
2
3
4
となります。「break」メソッドにより繰り返し処理そのものが終了しますので、「5」以降は出力無となります。

どのような場面で使われるか

先ほどは「while」による繰り返し処理でしたが、今度は「each」による繰り返し処理を見てみましょう。
<Rubyプログラム>
count = 0
("a".."g").each{|str|  
count += 1
if count % 3 == 0 then
next        
end
print(str + "\n");    
}


今回の繰り返し処理は「("a".."g").each{」から最後の「}」までとなり、ブロックパラメータ「str」に配列「("a".."g")」のaからgまでが渡され繰り返します。「each」は配列の最初から最後までを自動で繰り返し、全ての要素に対して処理を実行し「print(str + "\n");」で出力します。

ここで、条件文「if count % 3 == 0 then 」が成立、 つまりcountが3の倍数の時だけ、「next」メソッドが実行されます。
<出力>
a
b
d            
e
g
3番目の"c"と6番目の”f"が出力されません。

redoとの比較

「each」による繰り返し処理の中で「redo」メソッドを見てみましょう。
<Rubyプログラム>
count = 0
("a".."g").each{|str|  
count += 1
if count == 5 then
redo        
end
print(count,str + "\n");    
}


先ほどと同じように繰り返し処理ブロックは「("a".."g").each{」から最後の「}」までとなり、配列「("a".."g")」のaからgまで繰り返します。「each」により全ての要素に対して処理を実行し「print(count,str + "\n");」でcountと配列を出力します。

ここで、条件文「if count == 5 then 」でcountが5の時、「redo」メソッドが実行されもう一度戻って処理するためcountのみ進みます。
<出力>
1a
2b
3c
4d            
6e
7g
countが5の時再処理となり、countが6となって"e"が出力されます。

continueと同じ処理を行う

Rubyおける「next」メソッドは、PHPやPythonの「continue」と同じ働きをします。
<PHPプログラム>
$var = 0;
do {
$var++;
if ( $var == 5 ) {
continue;
}
echo $var;
} while ( $var < 8);


「do{~}while()」も繰り返し処理となります。その処理の中で「if ( $var == 5 ) {」の条件文により、$varが5の時、繰り返し処理を「continue(継続)」する、すなわち次のステップへ移り、次の繰り返し処理を継続します。つまり、この「continue(継続)」はRubyの「next」メソッドと同じ働きをします。
<出力>
1
2
3
4
6             
7
「5」がスキップされ出力されていません。このようにPHPの「continue 」がRubyの「next」メソッドと同じように繰り返し処理をスキップさせる働きをするということがわかります。

nextメソッドの使い方

「times」による繰り返し処理内での「next」メソッドの使用例を見てみましょう。
<Rubyプログラム>
8.times { |a|
if a==0 or a==5 then
next
end
puts a
}

<出力>
1
2
3
4
6             
7
「8.times { |a| 」でブロックパラメータ「a」が0~7まで変化しながら、8回繰り返し処理を実行します。「puts a」で「a」を出力しますので「0」~「7」まで出力されます。

ここで条件「if a==0 or a==5 then 」により「a」が「0」か「5」の時、nextメソッドが実行され、次のステップへスキップされますので「0」と「5」は出力されません。

「times」の同じような繰り返し処理として「upto」と「downto」での「next」メソッドの使用例も下記します。
<Rubyプログラム>
1.upto(7) { |a|
if a==5 then
next
end
puts a
}


<出力>
1
2
3
4
6             
7
「1.upto(7) { |a| 」でブロックパラメータ「a」が「1」~「7」まで1ずつ増加しながら、繰り返し処理を実行します。「next」メソッドにより「5」は出力されません。

「upto 」メソッドにより、自由な位置からのスタート、ストップが可能となります。

<Rubyプログラム>
7.downto(1) { |a|
if a==5 then
next
end
puts a
}


<出力>
7
6
4
3             
2
1
「7.downto(1) { |a| 」でブロックパラメータ「a」が「7」~「1」まで1ずつ、今度は減少しながら、繰り返し処理を実行します。「next」メソッドによりやはり「5」は出力されません。

先ほどの例では、ブロックパラメータは1ステップずつ変化していましたが、いろいろなステップでの繰り返し処理をしたい場合は「step」メソッドを使います。
<Rubyプログラム>
1.step(7, 1.5){ |a|
if a==5.5 then
next
end
puts a
}


<出力>
1.0
2.5
4.0
7.0           
「1」~「7」まで「1.5」ステップの繰り返し処理が実行されます。「a」==5.5の処理がスキップされます。

その他

ここで、条件文の書き方の別な例を挙げます。
<Rubyプログラム>
8.times { |a|
next if a==0 or a==5
puts a
}

これまでの「if(条件文)then」next「end」は、(条件文)が成立時に「next」が実行されるようなプログラムですが、上記の例のように「next」を先に書き、その直後に「if(条件文)」を記載することで全く同じ条件文をもったプログラムとなります。

出力も全く同じになります。こちらの方が記述が簡単ですので使ってみてください。

これまで連続処理内での「next」メソッドの使い方を見てきましたが、最後に少し特別な使い方を紹介します。配列データに直接働かせる「succ」メソッドと同じ働きをする「next」メソッドの使い方になります。(「next」は「succ」メソッドの別名)
<Rubyプログラム>
s = "abc"
puts s.succ
s = "abc123"
puts s.next

<出力>
abd
124
ここではストリング"abc"の最後のstringの次が指定され”d”となり"abd"と出力されています。また次の例では、ストリング"abc123"の最後のstring"3"の次"4"が指定され"abc124"が出力されています。

Rubyのnext メソッドのまとめ

Rubyの「next」メソッドの特徴と基本的な使い方について具体例をあげて見てきました。特に「for」「while」「each」「times」といった繰り返し処理の連続処理を実行中、ある条件が成立した時のみ処理をスキップしたい場合に、この「next」メソッドが効力を発揮します。使ってみて下さい。

Related