ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

rubyで指定回数実行して、最大数に達した時エラーにする書き方をまとめる

はじめに

一定回数リトライして、ダメだったらエラーにする、みたいな処理はよくある。

loop

num = 0
loop do
  num += 1
  puts num
  break  if num == 3
end

結果は

MacBook-Air:loop take$ ruby loop.rb 
1
2
3

まぁ、普通のloopだ。インクリを自分で書くところがイケてない。

while

num = 1
while num <= 3 do
  puts num
  num += 1
end

結果は同様。終了条件をwhileで書ける分短くなるが、インクリを自分で書くところはイケてない。

for

for num in 1..3 do
  puts num
end

rubyではforは使わないeachを使えって説はよく見るけど連続した数値オブジェクトの場合結構シンプルでアリかと思ってしまった。

times

3.times do |num|
  puts num+1
end

0からというところがイマイチ。

おわりに

だいたい既定回数になるときまで失敗するとraiseするようなコードを書くことが多い。(それまではrescueで拾ってretryする)その場合、timesを使うと、3にtimesをまわした場合、numが2のときにraiseしなければならない。この1差はイケてない。

そう考えると以下のようにforで書くのがまだいいかなと思うんだけど、いかがでしょう。

max = 3
for num in 1..max do
  puts num
  if num == max
    raise "raise!"
  end
end
MacBook-Air:loop take$ ruby for.rb 
1
2
3
for.rb:5:in `block in <main>': raise! (RuntimeError)
  from for.rb:2:in `each'
   from for.rb:2:in `<main>'