Ruby入門8: 繰り返し

Ruby入門
CANIT先生
CANIT先生

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

牛山くん
牛山くん

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

猫田さん
猫田さん

がんばってまーす

CANIT先生
CANIT先生

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

Rubyの繰り返しを学ぼう

コミュニケーション
CANIT先生
CANIT先生

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

牛山くん
牛山くん

5回連続攻撃とか

猫田さん
猫田さん

10蓮ガチャとか

CANIT先生
CANIT先生

二人とも心当たりがあるようですね。さて、このような同じ行動をコンピューターに繰り返しをさせるプログラムが、Rubyには用意されています。大きく分けると4つなので、まずはその4つを見ていきましょう

  1. 条件を満たしている間は繰り返しを続ける(while文)
  2. 回数が決まっていて、それを順番に片付けたい(for文)
  3. すべての要素に対してほぼ同じことをしたい(each文)
  4. 基本的に無限に繰り返して、ある条件になると繰り返しをやめる(loop文)

順番に解説していきます。

rand文

Rubyでの『繰り返し』のプログラムをゲームで例えながら説明するために、最初にrand文を紹介しておきます。

rand(70)

これがrand文です。このプログラムでは、0から69までの整数をランダムに生成してくれます。

Rubyでの繰り返し①:while文

パソコン
CANIT先生
CANIT先生

まずは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が出たんでしょうねぇ

CANIT先生
CANIT先生

そのとおりです。 猫田さん、さえていますね

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

猫田さん
猫田さん

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

CANIT先生
CANIT先生

そうですね。やがて、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文の外に出る。そのような流れです。

ここではloopの中から出ていますが、while文、for文、each文でも同じことができます。

ドット記法

パソコン

eachの説明の中で、

range.each do |num|

という構文が現れました。

CANIT先生
CANIT先生

この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も「もう一度はじめから実行する」ことができます。

まとめ

パソコン
CANIT先生
CANIT先生

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

牛山くん
牛山くん

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

CANIT先生
CANIT先生

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

猫田さん
猫田さん

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

CANIT先生
CANIT先生

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

挫折率が高い??プログラミング学習のポイント
駆け出しエンジニアが一緒に学ぶ
CANITは、Progateやドットインストールで独学している人達同士をつなげます。駆け出しエンジニアのあなたのためのSNSです。
Ruby入門
【この記事を書いた人】
CANIT 先生

あらゆるプログラミング言語をあやつるフリーの凄腕講師。温和な性格で「わかるまで教えます」がモットー。たまに時間ができると動物の仲間達に、プログラミングを教えることもある。現在の生徒は牛山くんと猫田さん。

CANIT
タイトルとURLをコピーしました