おぴよの気まぐれ日記

おぴよの気まぐれ日記

岡山やプログラミング、ファッションのこと、子育てや人生、生き方についての備忘録。

【Ruby】色々な繰り返し処理を学ぼう(each, for, while, times, next, break)

こんにちは。opiyoです。

今回は色々なパターンで使うRubyの繰り返し処理についてです。 それぞれ微妙な違いはあれど改めて、どういう場面で何を使うのか。実際のプログラムと共に紹介します。

  • for文の基本的な使い方が知りたい
  • こんな時やあんな時、for文をどう使うの!?
  • for文の途中で抜けたい!

こんな悩みを解決していければと思います。

rubyの eachの使い方

ごめんなさい。先にeachを書かせてもらいます!

理由は簡単で、仕事の中でforを使った記憶が無いからです...

なので、基本的にこれだけ覚えておけば問題ないと思います。それぐらいeachでほとんど事足ります。

オブジェクト.each do |変数|
  繰り返し処理
end

配列の場合

strs = ['a', 'b', 'c']
strs.each do |str|
  puts str
end

↓
a
b
c

ハッシュの場合

strs = {dog: '', cat: ''}
strs.each do |key, value|
  puts "#{value}は英語で#{key}"
end

↓
犬は英語でdog
猫は英語でcat

オブジェクトの場合

データベースから取得したオブジェクトを繰り返す場合の処理です。

users = NewUser.order(id: :desc).limit 3
 =>
<id: 16, name: "opiyo">,
<id: 15, name: "cat">,
<id: 14, name: "dog">

users.each do |user|
  puts user.name
end

↓
opiyo
cat
dog

rangeの場合

rangeは[最小値..最大値]のようなデータの事です。

この例だと今日から月末までの日付を出力する処理です。

# `end_of_month`はrailsで使えるメソッドです。
(Date.today..Date.today.end_of_month).each do |day|
  puts day
end2019/12/16
2019/12/17
2019/12/18
2019/12/19
2019/12/20
2019/12/21
2019/12/22
2019/12/23
2019/12/24
2019/12/25
2019/12/26
2019/12/27
2019/12/28
2019/12/29
2019/12/30
2019/12/31

rubyの forの使い方

for 変数 in オブジェクト do
  繰り返しの処理
end

変数に格納されたデータを1つ1つオブジェクトに渡しながらdo endの中に書かれた処理が実行されます。

では、それぞれの場合を想定して実際に動かしてみます。

文字列の配列の場合

strs = ['a', 'b', 'c']
for strs in str do
  puts str
end

↓
a
b
c

数値の配列の場合

strs = [1, 2, 3]
for str in strs do
  puts str
end1
2
3

配列の配列の場合

strs = [['a',1], ['b',2], ['c',3]]
for str in strs do
  puts str
end

↓
a
1
b
2
c
3

ハッシュの配列の場合

strs = {dog: '', cat: ''}
for str in strs do
  puts str
end

↓
dog
犬
cat
猫

ハッシュの場合はkeyvalueに分けて取得することができます!

strs = {dog: '', cat: ''}

# keyだけ取得する
for key, value in strs do
  puts key
end

↓
dog
cat

# valueだけ取得する
for key, value in strs do
  puts value
end

↓
犬
猫

rubyの whileの使い方

while 条件 do
  繰り返し処理
end

whileは、ある条件がokになるまで実行されます。

i = 0
while i <= 5
  puts i
  i += 1
end0
1
2
3
4

この場合ですとiが5より大きくなるまで処理が実行されます。

注意なのは条件がokにならないと処理が永遠に続きます。

この場合は、処理の中でiをマイナスしているので永遠に5より大きくならず無限ループになります。

i = 0
while i <= 5
  puts i
  i -= 1
end0
-1
-2
-3
-4
-5
-6
-7
-8
-9
.
.
.

rubyの timesの使い方

繰り返す回数.times do
  繰り返す処理
end

timesは繰り返したい数だけ処理します。

5.times do
  puts "test"
end

↓
test
test
test
test
test

今何回めの処理かを判定処理の中で使いたい場合は、doの後に|変数|を書いてあげます。

5.times do |i|
  puts "#{i} 回目のtest"
end0 回目のtest
1 回目のtest
2 回目のtest
3 回目のtest
4 回目のtest

注意点は0から始まる点です。

rubyの uptoの使い方

最小値.upto(最大値) do |i|
  puts 'test'
end  

timesと似ていますが、uptoの場合は最小値 -> 最大限まで繰り返し処理をします。

1.upto(5) do |i|
  puts "#{i} 番目のtest"
end1 番目のtest
2 番目のtest
3 番目のtest
4 番目のtest
5 番目のtest

rubyの downtoの使い方

最大値.downto(最小値) do |i|
  puts 'test'
end  

uptoと似ていますが、downtoの場合は最大値 -> 最小値まで繰り返し処理をします。

5.downto(1) do |i|
  puts "#{i} 番目のtest"
end5 番目のtest
4 番目のtest
3 番目のtest
2 番目のtest
1 番目のtest

rubyの繰り返しを制御する

繰り返し処理の中で条件に応じた処理が可能です。

rubyの繰り返しから次の処理へ(next)

2回目の繰り返しの場合はskipし次の処理を行います。

strs = [1, 2, 3]
strs.each do |str|
  next if str == 2
  puts "#{str} 番目の処理です。"
end1 番目の処理です。
3 番目の処理です。

rubyの繰り返しを終了する(break)




2回目以降の繰り返しを終了します。

strs = [1, 2, 3, 4, 5]
strs.each do |str|
  break if str == 3
  puts "#{str} 番目の処理です。"
end1 番目の処理です。
2 番目の処理です。

rubyの繰り返し処理のまとめ

様々な繰り返し処理について、まとめてみました。

正直、eachnextbreakだけ覚えておけば事足りると思いますが使う時が来れば積極的に使っていきましょう!