【Ruby】whileメソッドを使用してエラー処理・繰り返し処理を実装する

## 概要
rubyの学習を進めていく中で、「Rubyのみでポートフォリオを作りたい！」と思い、rubyでポートフォリオを作成しました。
その中で、この記述を早く知ることができれば！と思ったことがいくつもありました。
そこで、もし**Rubyを使ってプログラムを作りたい**という同じ気持ちの方に参考になればと思い、この記事を書きました。
＊何回か分けて書きたいと思っています。


## この記事の内容
* 繰り返し処理whileメソッド を使えるようになる
* エラー処理に対応できる記述ができる
* 繰り返し処理に制限をつけることができる


## whileメソッドとは　

**条件を満たすまでループするというメソッドです**
if文と組み合わせると以下のように使用できます

```rb:基本
while true
  if 条件
    trueの処理
    break
  else
    falseの処理
  end
end

```



**「お願いした値が入力されるまで、何回でもお願いすることができるメソッド」**として、エラーにも対応できます。


## 使う場面

**条件分岐の時に、正しい値以外受け付けないようにしたい時！！**

皆様は、日本の自動販売機に外国のお金を入れてジュースを購入されますか？
そんなことはしないですし、もし無理やり入れても出てこない可能性が非常に高いです。
もしくは故障してしまうかもしれません。

それはプログラムも同じで、
 **正しい値（硬貨）を取得することができなければプログラム（自動販売機）は動きません。**

ですので、外国の硬貨を自動販売機に突っ込まれたら、**「日本の硬貨を入れてください」**と伝えることができるプログラムにする必要があります。それを**whileメソッド**で実現しましょう。







## 例文

今回は、**「whileメソッド」**と**「if文」**を組み合わせてエラー処理に対応するプログラムを作成します。

**今回のプログラム**
- 金額の入力を要求する
- 「100以上」の「数字」を入力した場合、「true」を出力
- それ以外の場合は「false」を出力

###普通のif文
```rb:main.rb
    #①入力したお金をmoneyという変数に格納する
    print "お金を入れてください。"
    money = gets.chomp.to_i

    #②moneyに入っている数値で条件分岐
    if money >= 100 
       
       #=> 要求した数値の場合
       puts "１００円以上を受け取りました"
       # 終了

    else
       
       #=> 要求していない値の場合
       puts "100円以下なのでたりません。再度お金を入力してください。"
       # 終了 

    end

```
プログラムを動かすと・・・
![スクリーンショット 2020-12-13 17.59.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690622/b20e85e3-e774-2c05-f342-b07fc8880804.png)


if文は、「一致する場合」、「一致しない場合」を分岐してくれますが、
**分岐をすると終了してしまう**ため、その都度プログラムを起動（ruby main.rb)する必要が出てきます。



### while trueを入れたif文
では、whileメソッドを入れるとどうなるでしょうか？
(変更を "+" で表現）

```rb:main.rb

+  while true

    #①入力したお金をmoneyという変数に格納する
    print "お金を入れてください。"
    money = gets.chomp.to_i

    #②moneyに入っている数値で条件分岐
    if money >= 100 
       
       #=> 要求した数値の場合
       puts "１００円以上を受け取りました"
+      break
       # 終了

    else
       
       #=> 要求していない値の場合
       puts "100円以下なのでたりません。再度お金を入力してください。"
+      # 終了せず、最初に戻ります

    end


+ end


```


再度プログラムを動かすと・・・

![スクリーンショット 2020-12-13 18.04.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690622/4b22b597-14a5-b871-e545-053f2c81af8a.png)



 なんということでしょう。whileメソッドを入れるだけで、
**プログラムが何回もお願いするようになるではありませんか！!**
実行結果をみても、「ruby main.rb」は１回しか実行していないので、処理がループしているのが分かります。
これにより、プログラムが要求した値を入力するまで繰り返せるので、
エラー処理に対応することが可能です。

ただし、**「break」**を入れないと、いつまで経ってもループしますので、しっかり入れましょう！



## 繰り返し処理

条件分岐時のエラー処理以外にも、以下の使い方もできます！

###回数を制限して繰り返す
私は「サッカーのPK戦」を再現しました。
その時に、***「５回だけ繰り返す処理」***を実装するために使用しました！
（今回は簡略化しています）

**今回のプログラム**
- 繰り返し同じ処理を実装する
- １回行う度に、カウントが１増えるように実装する
- 制限（今回は<5)を超えると、終了します。


```rb:main.rb
#回数の初期値
kick_count = 0 

while kick_count < 5
  kick_count += 1   #=> カウントを＋１します (kick_count = kick_count + 1 の略)
  puts "出力"       #=> これを繰り返します
end

```
出力結果
![スクリーンショット 2020-12-13 19.52.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690622/619e7cd4-3212-2f10-23c6-814ca67cb03b.png)

これで、同じ処理を５回実行するプログラムができました。
これでも動作しますが、実は修正したい部分が１箇所あります。

それは**、今後変更する可能性のある部分を数字ではなく変数もしくは定数に格納すること**です。
今回の場合は、while count < 5　の「5」になります。


```rb:main.rb
  count = 0
+ GAME_NUM = 5  #=> 5回を定数に格納する

# -  while count < 5
+  while count < GAME_NUM
    count += 1
    puts "出力"
  end

```
上記のように定数に格納することで、ゲームの回数が変更になった場合でも、
GAME_NUMの数値を変更することで簡単に変更できます。
今回はGAME_NUMを使う箇所は１箇所しかありませんが、
何箇所も記述してある場合、全てを変更できるので便利です。

今回は、**whileメソッドを使用して、繰り返し処理・エラー処理を実装する方法**についての話でした。

## まとめ
エラー処理、繰り返し処理に対応する時にお世話になりました。
他にもrubyの記事を書きたいと思いますので、目を通していただけると幸いです。