【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 end ↓ 2019/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 end ↓ 1 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
猫
ハッシュの場合はkeyとvalueに分けて取得することができます!
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 end ↓ 0 1 2 3 4
この場合ですとiが5より大きくなるまで処理が実行されます。
注意なのは条件がokにならないと処理が永遠に続きます。
この場合は、処理の中でiをマイナスしているので永遠に5より大きくならず無限ループになります。
i = 0 while i <= 5 puts i i -= 1 end ↓ 0 -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" end ↓ 0 回目の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" end ↓ 1 番目の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" end ↓ 5 番目の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} 番目の処理です。" end ↓ 1 番目の処理です。 3 番目の処理です。
rubyの繰り返しを終了する(break)
2回目以降の繰り返しを終了します。
strs = [1, 2, 3, 4, 5] strs.each do |str| break if str == 3 puts "#{str} 番目の処理です。" end ↓ 1 番目の処理です。 2 番目の処理です。
rubyの繰り返し処理のまとめ
様々な繰り返し処理について、まとめてみました。
正直、eachとnextとbreakだけ覚えておけば事足りると思いますが使う時が来れば積極的に使っていきましょう!