
二人とも、Rubyの学習は順調ですか?

毎日コツコツと頑張っていますよ

がんばってまーす

いいですね。では、今回の講義では『繰り返し』を学んでいきましょう。前回の講義ではゲームに例えましたが、今回もその要領で解説します
Rubyの繰り返しを学ぼう


ゲーム内で同じ行動を繰り返すことは、よくありますね

5回連続攻撃とか

10蓮ガチャとか

二人とも心当たりがあるようですね。さて、このような同じ行動をコンピューターに繰り返しをさせるプログラムが、Rubyには用意されています。大きく分けると4つなので、まずはその4つを見ていきましょう
- 条件を満たしている間は繰り返しを続ける(while文)
- 回数が決まっていて、それを順番に片付けたい(for文)
- すべての要素に対してほぼ同じことをしたい(each文)
- 基本的に無限に繰り返して、ある条件になると繰り返しをやめる(loop文)
順番に解説していきます。
rand文
Rubyでの『繰り返し』のプログラムをゲームで例えながら説明するために、最初にrand文を紹介しておきます。
rand(70)
これがrand文です。このプログラムでは、0から69までの整数をランダムに生成してくれます。
Rubyでの繰り返し①:while文


まずはwhile文です。while文は『条件を満たしている間は繰り返しを続ける』プログラムと解釈してください
設定
あなたはゲームをしています。そして、hpが初期値100の敵がいて、hpを少しずつ減らしていくのが目的。そんな場面を想像してください。
すると、プログラムは以下のようになります。

まず、hpの初期値を100に設定します。そしてwhile文です。
while文では、while, do, endが中心部分です。if文と似ていますが、whileとdoの間に条件文がありますね。この条件を満たしている間は、doとendの間を何回でも繰り返します。
この例だと、条件文が、
hp > 0
です。
つまり、hpが0より大きいときは、doとendの間を実行します。

敵のHPがゼロになるまでボコボコにするんですね。いいぞー
さて、doとendの中にrand文を使って、0から69の間の整数をランダムに生成します。このランダムに生成された整数を数randomに入れます。そして、次の行で、hpをrandom分だけ減らす。そんな流れです。

ランダムの数字は見えていないけど、敵のHPが100から62になったってことは、38が出たんでしょうねぇ

そのとおりです。 猫田さん、さえていますね
敵のHPが徐々に減っていく過程をprint文で表示します。敵のHPが残っているときは、『whileとdoの中の条件文に戻る』を繰り返しています。

で、そのうち敵のHPはゼロになる……と

そうですね。やがて、HPがゼロ以下になるので、そしたらwhile文は終了です
for文

次はfor文を見ていきましょう。
for文を使うのは、あらかじめ攻撃できる回数が決まっているときです。ここでは、攻撃の回数を3回として、プログラムしてみます。

前のwhile文との違いは、
for num in 1..3 do
この部分だけです。
randの中の数は都合により変えてあります。ぜひ70でもやってみてください。
さて、この文の意味はnumを1から3まで変えながら、doとendの間を繰り返す、という意味です。doとendの間が三回実行されてプログラム終了します。
each文
each文の本当のありがたみを感じるのは、後で書く配列やハッシュです。ここでは書き方だけを示しておきます。

rangeで範囲を決めています。この場合は、2から4まで、つまり、2, 3, 4の三回が実行されます。この例では、numを何回目の攻撃かで使っています。
loop文
最後はloop文です。プログラムを見てみましょう。

loop文は、numという変数を回数を数えるために使っています。
if文でhpがマイナスになると、break文を実行します。
そして、breakが実行されると、loop文の外に出る。そのような流れです。
ドット記法

eachの説明の中で、
range.each do |num|
という構文が現れました。

このrangeとeachの間にある’.'(ピリオド)について説明しておきます
正式には「メソッド呼び出し」俗に「ドット記法」と呼ばれています。このようにドットの後に数が来ない書き方は、小数点を表すピリオドの意味ではなく、文の終わりを示すピリオドの意味でもありません。
ドットの前(この場合だとrange)をオブジェクト(object)、ドットの後(この場合だとeach)をメソッド(method)と呼びます。
意味は、オブジェクトをメソッドで処理する。この場合だとrangeという変数をeachとして処理するという意味です。
具体例
もう少し分かりやすい例を挙げると、
puts 3.14.round
と書くと、3.14という小数を四捨五入(英語でroundといいます)してくれます。
最初のピリオドは小数点のピリオドですが、次のピリオドはその後ろがメソッドであることを表すピリオドです。ピリオドの意味が違うので注意してください。

これは、紛らわしいですね
また、
puts 3.14.to_s
と書くと、3.14という小数を文字列(to_sはto string: 文字列への略です)に変換してくれます。逆に、
pie = “3.14”
puts pie.to_f
と書くと、”3.14″という文字列を、3.14という小数に変換してくれます。to_fはto float: 浮動小数点数へ の略です。整数にしたい場合は、
number = “123233”
puts number.to_i
と書きます。to_iはto integer: 整数へ の略です。
他の繰り返し

他にも、繰り返しの方法には、untilがあります。条件式が偽の時に繰り返し、真になると終了するという書き方です。
while hp > 0 do
と
until hp =< 0 do
はまったく同じ意味になります。

ゼロより上ならGO、ゼロ以下ならSTOP。……たしかに、同じ意味ですね

これも紛らわしいなぁ。ちゃんと見ないと、頭がごっちゃになりそう
また、while, untilは後置できます。
hp -= rand(60) while hp > 0
のような書き方ができます。正式には、while修飾子、until修飾子などと言います。こちらの方が英語の語順に近いです。
他にもある『繰り返し』
他にも繰り返しの方法として、times, upto, downto, stepがあります。いずれも指定回数だけ繰り返す書き方で、forに似ています。ただし、回数と増減の書き方が違うので注意です。
また、繰り返し内で順番を変える方法として、breakを紹介しました。その他にも、next, redo, retryがあります。
前述のように、breakは繰り返しを出ることができます。
nextは「もっとも内側のループの次の繰り返しにジャンプします」。
redoは「繰り返しの条件のチェックを行わず、現在の繰り返しをやり直します」。
retryも「もう一度はじめから実行する」ことができます。
まとめ


というわけで、今回の講義では「繰り返し」を学びました。

なんか同じような意味のコードがたくさんあるんですね

得る結果は同じでも、書いてあるプログラムはぜんぜん違う……なんてことは、プログラミングではよくあることなんですよ。だから、プログラミングは深いし、面白いし、センスが問われるんです

クイズの解き方が複数あるようなものかしら

そうですね。そのニュアンスで間違いないですよ