Rubyで便利な繰り返し処理について、やり直したい時に使える"redo"の使用方法について、まとめてみました。
friends = ['キム','リー','アルフォンソ']
friends.each do |friend|
print "#{friend}は一番の親友ですか? => "
rank = ['ベストフレンド','中の上','よっ友'].sample
puts rank
#ベストフレンドでなければ、もう一度聞き直し無理やりベストフレンドと言わせる
redo unless rank == 'ベストフレンド'
end
キムは一番の親友ですか? => 中の上
キムは一番の親友ですか? => よっ友
キムは一番の親友ですか? => 中の上
キムは一番の親友ですか? => ベストフレンド
リーは一番の親友ですか? => 中の上
リーは一番の親友ですか? => ベストフレンド
アルフォンソは一番の親友ですか? => ベストフレンド
上記のように、ベストフレンドというまで、何度も同じ質問が続きます。
##無限にやり直しを避けるために、_count_を使う
friends = ['キム','リー','アルフォンソ']
count = 0
friends.each do |friend|
print "#{friend}は一番の親友ですか? => "
# わざとベストフレンドと答えないようにする
rank = ['中の上','よっ友'].sample
puts rank
count += 1
#やり直しは3回までにする
redo if rank != 'ベストフレンド' && count < 3
#カウントをリセット
count = 0
end
キムは一番の親友ですか? => よっ友
キムは一番の親友ですか? => よっ友
キムは一番の親友ですか? => 中の上
リーは一番の親友ですか? => 中の上
リーは一番の親友ですか? => よっ友
リーは一番の親友ですか? => よっ友
アルフォンソは一番の親友ですか? => 中の上
アルフォンソは一番の親友ですか? => よっ友
アルフォンソは一番の親友ですか? => よっ友
やり直しの回数をcountを使って制限できた。
##無限ループに気をつける
friends = ['キム','リー','アルフォンソ']
count = 0
friends.each do |friend|
print "#{friend}は一番の親友ですか? => "
# わざとベストフレンドを答えないようにする
rank = ['中の上','よっ友'].sample
puts rank
count += 1
#やり直しは3回までにする
redo if rank != 'ベストフレンド' && count < 3
end
redo if rank != 'ベストフレンド' && count < 3行の下に、
"count = 0" を入れ忘れると、無限ループする。
friends = ['キム','リー','アルフォンソ']
friends.each do |friend|
print "#{friend}は一番の親友ですか? => "
rank = ['ベストフレンド','中の上','よっ友'].sample
puts rank
#firstではなければ、もう一度聞き直し無理やりベストフレンドと言わせる
redo unless rank == '親友'
end
また、カウント制限なしで、redoを使う際
redo unless rank == '親友' のように配列の要素にない値を指定すると、これまた無限ループするので注意が必要です。
試してみたら、見事に無限ループしました、、、
プロを目指す人のためのRuby入門