はじめに
- 繰り返し処理の動作を変更するための制御構造について、遊びながら学んでみた
- 学習したことの備忘録
主な内容
- break
- redo
- catchとthrow
break(ひたすらラーメンを完食していくコード)
break
:繰り返し処理を脱出できる
ramens = ["豚骨ラーメン", "醤油ラーメン", "塩ラーメン"]
tastes = ["スープを飲む", "麺をすする", "完食!"]
ramens.each do |ramen|
tastes.shuffle.each do |t|
puts "#{ramen}, #{t}"
break if t == "完食!"
end
end
shuffleで、「スープを飲む」, 「麺をすする」, 「完食!」がランダムに入れ替わり、「完食!」でbreakする。それを、「豚骨ラーメン」,「醤油ラーメン」,「塩ラーメン」のそれぞれについて繰り返す。
実行結果例
とんこつラーメン, スープを飲む
とんこつラーメン, 麺をすする
とんこつラーメン, 完食! # ここでbreak
醤油ラーメン, スープを飲む
醤油ラーメン, 完食! # ここでbreak
塩ラーメン, 完食 # ここでbreak
redo(AさんがBさんに仕事を押し付けるコード)
redo
:繰り返し処理の最初に戻る
補足
「re:再び」「do:実行する」
questions = ["案件A", "案件B", "案件C"]
questions.each do |q|
print "Aさん「#{q}を手伝ってもらえますか?」"
answer = ["Bさん「今、手が離せないのです」","Bさん「他の方を頼ってください」", "Bさん「良いですよ!」"].sample
puts answer
redo unless answer == "Bさん「良いですよ!」"
puts "Aさん「いや〜さすが!」"
end
「redo unless answer == "Bさん「良いですよ!」"」によって、answerが「良いですよ!」になるまで、「print "Aさん「#{q}を手伝ってもらえますか?」"」の部分が繰り返される。まさに地獄のような問答。
実行結果例
Aさん「案件Aを手伝ってもらえますか?」Bさん「他の方を頼ってください」
Aさん「案件Aを手伝ってもらえますか?」Bさん「他の方を頼ってください」
Aさん「案件Aを手伝ってもらえますか?」Bさん「今、手が離せないのです」
Aさん「案件Aを手伝ってもらえますか?」Bさん「良いですよ!」 # ここでredo解除
Aさん「いや〜さすが!」
Aさん「案件Bを手伝ってもらえますか?」Bさん「他の方を頼ってください」
Aさん「案件Bを手伝ってもらえますか?」Bさん「良いですよ!」 # ここでredo解除
Aさん「いや〜さすが!」
Aさん「案件Cを手伝ってもらえますか?」Bさん「他の方を頼ってください」
Aさん「案件Cを手伝ってもらえますか?」Bさん「他の方を頼ってください」
Aさん「案件Cを手伝ってもらえますか?」Bさん「今、手が離せないのです」
Aさん「案件Cを手伝ってもらえますか?」Bさん「他の方を頼ってください」
Aさん「案件Cを手伝ってもらえますか?」Bさん「良いですよ!」 # ここでredo解除
Aさん「いや〜さすが!」
catchとthrow(肉と魚料理を堪能し、デザートとコーヒーでしめるコード)
catchとthrow
:大域脱出
書き方catch タグ do #繰り返し処理 throw タグ end
foods = ["お肉料理", "魚料理", "デザート"]
drinks = ["ビール", "ワイン", "コーヒー"]
catch :done do
foods.shuffle.each do |f|
drinks.shuffle.each do |d|
puts "#{f}と#{d}"
if f == "デザート" && d == "コーヒー"
puts "お会計!"
throw :done
end
end
end
end
「catch :done do」が始まりの合図。「throw :done」で全ての繰り返し処理を脱出する。つまり、「if f == "デザート" && d == "コーヒー"」が真なら、「お会計!」となって処理が終了。
実行結果例
魚料理とビール
魚料理とコーヒー
魚料理とワイン
お肉料理とコーヒー
お肉料理とワイン
お肉料理とビール
デザートとビール
デザートとコーヒー # ここで脱出!
お会計!
まとめ
- 楽しく学習できたので、たまにはこういうのも良いと思った
- 個人的にお気に入りは、redoかな・・・
⚠️学習4ヶ月目の初学者による投稿です。
⚠️間違いがあるかもしれません。ご容赦ください。
⚠️ご指導、ご教授いただけると幸いです。