【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
だけ覚えておけば事足りると思いますが使う時が来れば積極的に使っていきましょう!