自己紹介
はじめまして、はる(@lemonade_37)と申します。完全異業種からのエンジニア転職を目指して学習をしています。
概要
Ruby Silver3.1 の学習のために使用した、Rubyのループ処理のまとめです。
既にわかりやすくまとめられている記事も多いですが、Ruby Silverの問題を解きながら学んだ、引っかかりやすい部分なども含めてまとめています。
初学者のため、間違っている箇所や、紹介した方法よりも良い方法があるかもしれませんので、その際は教えて頂けると嬉しいです🙇
ループ処理の基礎
ループ処理の概念や基礎についてはこちらの記事でまとめました。
配列やハッシュ内で繰り返す系
-
for
:指定した配列の要素に順番に実行したり、指定した範囲分繰り返しを行う。
※do
省略可
※for
とeach
の違いについては別記事にいただいたコメントが大変わかりやすいためご参照下さいfor i in [1, 2, 3] do print i * 2 end #=> 246 for i in 1..5 do print i end #=> 12345
-
each
:配列の各要素に対してブロックを評価する。ハッシュにも使用できる。
※ブロックを渡した時はdo
がない[1, 2, 3].each do |i| print i end #=> 123 {a: 1, b: 2}.each {|a| print a} #=> [:a, 1][:b, 2]
each
の仲間-
reverse_each
:各要素に対し逆順でブロックを評価する。
[1, 2, 3].reverse_each do |i| print i end #=> 321
-
each_index
:配列の各要素のインデックスに対してブロックを実行する。
["a", "b", "c"].each_index {|i| print i} #=> 012
-
each_with_index
:配列の各要素と、各要素のインデックスを一緒にブロックを渡せる。
["a", "b", "c"].each_with_index {|n, i| puts "値:#{n} インデックス:#{i}"} =begin =>出力 値:a インデックス:0 値:b インデックス:1 値:c インデックス:2 =end
-
ループ終了の条件を指定する系
-
while
:指定した条件式が真である間(偽になるまで)ループする。
※do
省略可ary = [1, 2, 3, 4, 5, 6, 7] i = 0 while i < 5 do print ary[i] i += 1 end #=> 12345
-
until
・while not
:指定した条件式が偽である間(真になるまで)ループする。while
の逆。
※do
省略可
-
loop
:break
でループを終了させない限りループし続ける。a = 0 loop do print a a += 1 if a >= 7 break end end #=> 0123456
ループ回数を指定する系
-
times
:指定した回数だけ繰り返す。指定が正の整数でない場合は何もしない。3.times {print "Hello"} #=> HelloHelloHello
times
のループの1回目は0番からスタートするため、出力は下記のようになる。3.times do |i| print i end #=> 012
-
upto
:指定した数値からMAXの数値まで1ずつ増やしながら繰り返す。指定は整数(負の数もOK)で行う。5.upto(10) {|i| print i} #=> 5678910
1
という数値からスタートし、3
という数値までループするため、スタートの数値は1
。
times
と混同しないよう注意!1.upto(3) do |i| print i end #=> 123
-
downto
:指定した数値からMINの数値まで1ずつ減らしながら繰り返す。指定は整数(負の数もOK)で行う。0.downto(-5) {|i| print i} #=> 0-1-2-3-4-5 3.downto(1) do |i| print i end #=> 321
-
step
:指定した数値から指定した上限・下限まで指定した数ずつ増やし / 減らしながら繰り返す。
上下限に負の数が指定された場合は、下限として解釈される。
スタートの指定値には少数や負の数も指定できる。(upto
とdownto
の自由度高いバージョンっぽい)
例)4.5
からスタートし、1.5
ずつ増やしながら、7.5
まで繰り返す。4.5.step(7.5, 1.5) {|n| print n} #=> 4.56.07.5
- 各ステップの大きさを指定しなければ、1回の繰り返しの増減幅はデフォルトで
1
になる。2.step(5) {|n| print n} #=> 2345
- 整数と少数を混ぜてもエラーにはならない。どちらか片方でも少数のときは、出力が少数で表示される。
2.0.step(5) {|n| print n} #=> 2.03.04.05.0
- 各ステップの大きさを指定しなければ、1回の繰り返しの増減幅はデフォルトで
その他
-
next
:next
を使った時点でそれ以降の処理を飛ばして次のループに移る。
例)2
の時はnext
以降のprint a
が飛ばされて、2
だけ出力されない。[1,2,3,4].each do |a| next if a == 2 print a end #=> 134
-
redo
:redo
を使うとループの初めから処理を繰り返す。
redo
するかどうかは、each do |a|
の部分のa
の値で判断している。redo
の繰り返しは1回のみ行われる。
例文では、each do |2|
のときの処理が2回繰り返されている。each文の中でa += 1
でa
の値は3
になっているので、3
が2回出力されている。
[1,2,3,4].each do |a|
a += 1
print a
redo if a == 2
end
#=> 23345
-
break
:break
を使った時点でループを抜け出すことができる。
まとめ
苦手意識のあったループ処理ですが、ひとつひとつ整理して、実際にコードを動かしてみることで少し理解できました。
Ruby Silverをきっかけに勉強できてよかったです!