0
0

More than 3 years have passed since last update.

[Ruby]繰り返し処理のやり直し redo

Last updated at Posted at 2020-05-09

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入門

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0