Ruby 繰り返し処理
繰り返し処理
繰り返し処理とは
- 同じ処理を何回も実行する
繰り返し処理
- for
- while
- do while
繰り返し処理each,for
構文 each
配列やハッシュ.each do |変数|
# 繰り返し実行したい処理
end
補足
配列の要素を最初から最後まで順番に取り出しながら、処理を実行する
構文 for
for 変数 in 配列やハッシュ do
# 繰り返し実行したい処理
end
例
each
numbers = [1, 2, 3, 4, 5]
numbers.each do |number|
puts number
end
1
2
3
4
5
整数の値が1個ずつ取り出されて
上記のようにターミナルに出力された
each 違う書き方
numbers.each { |number|
puts number
}
同じように出力される
これを1行で書くこともできる
numbers.each { |number| puts number }
配列の中身が文字列でも同様に書ける!
colors = ['red', 'green', 'blue']
colors.each do |color|
puts color
end
red
green
blue
と1個ずつ取り出してターミナルに出力された
eachで書いた処理をforで書き直し
for number in numbers do
puts number
end
1
2
3
4
5
と出力される
文字列が入ったcolorsの場合も同じ
for color in colors do
puts colors
end
red
green
blue
出力される
連想配列
scores = {nakamura: 90, sato: 80, takahashi: 100}
scores.each do |name, score|
puts "#{name}, #{score}"
end
nakamura, 90
sato, 80
takahashi, 100
このように連想配列の値を1個ずつ取り出して
キーと値を出力することができた
forは原則使わない
慣習としてeachでもforでも書ける時は、eachを用いる
forは、どうしても使わなければいけない明確な理由が明言できる人以外は、使っていはいけません
The Rudy Style Guideより
繰り返し処理 times
構文 times
繰り返し回数.times do
# 繰り返し実行したい処理
end
補足:配列を使わず、単純にn回処理を繰り返したいときに使う
timesを使って5回Hello!と出力
5.times do
puts 'Hello!'
end
Hello!
Hello!
Hello!
Hello!
Hello!
と5回出力される
変数の利用
何回目の繰り返しかを変数として利用することができる
5.times do |i|
puts "#{i}: Hello!"
end
0から始まるところに注意!
0: Hello!
1: Hello!
2: Hello!
3: Hello!
4: Hello!
このように繰り返しの回数を使うことができる
{}を使ったtimesの書き方
5.times { |i| puts "#{i}: Hello!" }
同じ結果となる
0: Hello!
1: Hello!
2: Hello!
3: Hello!
4: Hello!
複数行で書く書き方
5.times { |i|
puts "#{i}: Hello!"
}
同じ結果となる
0: Hello!
1: Hello!
2: Hello!
3: Hello!
4: Hello!
繰り返し処理 while
構文 while
while 条件式
# 繰り返し実行したい処理
end
補足:指定した条件が真である間、処理を繰り返す
数字を0から9まで10個出力するプログラム
i = 0
while i < 10
puts "#{i}:hello"
i += 1 # i = i + 1
end
まず、ループ用の変数を作る
0から出力したいので初期値は0
条件式 iが10以下ならば繰り返しを実行する
ループ用の変数iに1を足す
0:hello
1:hello
2:hello
3:hello
4:hello
5:hello
6:hello
7:hello
8:hello
9:hello
0から10まで数字を出力できた
補足
無限ループを発生させないよう注意!!
j = 0
while j < 10
puts j
end
jの初期値は0で
10以下の場合ループが継続されるが
jの値が変化せずいつまでもjに0が入っているため
条件がずっと成り立っている
その結果無限ループに、、
0が出力され続ける、、
強制的に止めるには^+Cキー
あえて無限ループにする場合もあるが、
基本的には無限ループにならないよう注意する!!
繰り返し処理 upto,downto
upto,downto
upto
- nからmまで数値を1ずつ増やしながら何かしらの処理を実行したい場合に使う
downto
- nからmまで数値を1ずつ減らしながら何かしらの処理を実行したい場合に使う
数値を10から14まで値を1ずつ増やしながら値を出力
10.upto(14) { |n| puts n }
10から14まで値を1ずつ増やしながら出力できた
10
11
12
13
14
数値を10から14まで値を1ずつ減らしながら値を出力
14.downto(10) { |n| puts n}
10から14まで値を1ずつ減らしながら出力できた
14
13
12
11
10
繰り返し処理 step
構文 step
開始式.step(上限値,一度に増減する大きさ)
補足:nからmまで数値をxずつ増やしながら何かしらの処理を実行したいときに利用
例)1,3,5,7,9
例
数値を1から10まで2ずつ増やして出力
1.step(10, 2) { |n| puts n }
上限の値10、一度に増減する大きさ2
1
3
5
7
9
このように出力される
数値を10から1まで2ずつ減らして出力
10.step(1, -2) { |n| puts n}
このように出力される
10
8
6
4
2
繰り返し処理 loop
構文 loop
loop do
# 繰り返し実行したい処理
end
補足:あえて無限ループを作りたいときに利用する
参考としてwhileで無限ループを書いてみる
n = 0
while true
puts n
n += 1
end
条件式がtrueなので永遠に条件式が満たされ
無限ループとなる
^+Cキーで無限ループを止める
loopメソッドを使った無限ループ
i = 0
loop do
puts i
i += 1
end
^+Cキーで無限ループを止める
制御構文break
breakを使うとループを抜けることができる!!
変数jを0から1ずつ足す繰り返し処理を行い
jの値が10になったらbreakを使ってループを抜ける処理
j = 0
loop do
puts j
j += 1
break if j == 10
end
もしjが10ならばbreakによってループを抜けるという処理
このように0から10まで出力されればOK
0
1
2
3
4
5
6
7
8
9
制御構文next
breakに関連してnextという処理も使ってみる
nextは、繰り返し処理を途中で中断して
次の繰り返し処理に進みたい場合に使う
例として数値が入った配列を用意
次に、eachで繰り返し処理を行なって
値が偶数であれば処理を中断して
次の繰り返し処理に進む
numbers = {1, 2, 3, 4, 5]
numbers.each do |n|
next if n % 2 == 0
puts n
end
nの値が偶数ならば、処理を中断して
次の処理に進むという意味
奇数だけ出力されていればOK
1
3
5
補足
この偶数を判定する処理は
next if n % 2 == 0
次にようにも書ける!
next if n.even?
evenメソッドは偶数かどうかを判定するメソッド
奇数判定はoddメソッド
next if n.odd?
今日は繰り返し処理まで!!
これから引き継ぎとかで残業多くなりそう〜〜
勉強時間頑張って確保するぞ
パワー
Discussion