0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Ruby】繰り返し処理の制御構造 (で遊んでみた)

Posted at

はじめに

  • 繰り返し処理の動作を変更するための制御構造について、遊びながら学んでみた
  • 学習したことの備忘録

主な内容

  • 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ヶ月目の初学者による投稿です。
⚠️間違いがあるかもしれません。ご容赦ください。
⚠️ご指導、ご教授いただけると幸いです。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?