🦩

Ruby 繰り返し処理

2023/02/07に公開

繰り返し処理

繰り返し処理とは

  • 同じ処理を何回も実行する

繰り返し処理

  • 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