Ruby 繰り返し

Rubyの繰り返しの以下、６つについて

* timesメソッド
* for文
* while文
* until文
* eachメソッド
* loopメソッド

## timesメソッド
一定の回数を繰り返す場合に使用する

### 指定回数を繰り返す
```ruby:
5.times do
  puts "timesメソッドの確認です"
end
```

```:実行結果
timesメソッドの確認です
timesメソッドの確認です
timesメソッドの確認です
timesメソッドの確認です
timesメソッドの確認です
```

実際は以下のように使用するのだろうか

```ruby:
i = 5
i.times do
  puts "timesメソッドの確認です"
end
```

```:実行結果
timesメソッドの確認です
timesメソッドの確認です
timesメソッドの確認です
timesメソッドの確認です
timesメソッドの確認です
```
do 〜 end　は　{ 〜 }　で書き換え可能。

### 繰り返し回数を知る
ブロックの中で繰り返している回数を知りたい場合は

```ruby:
5.times do |timesCount|
  puts "#{timesCount}：timesメソッドの確認です"
end
```

```:実行結果
0：timesメソッドの確認です
1：timesメソッドの確認です
2：timesメソッドの確認です
3：timesメソッドの確認です
4：timesメソッドの確認です
```

上記の通り始まりは0からになる。

## for文

### from〜toの指定

timesのように繰り返し回数の指定でなくfrom〜toの値を指定する。
timesと同じことをするには

```ruby:
for i in 0..4 do
  puts "#{i}：for文の確認です"
end
```

```:実行結果
0：for文の確認です
1：for文の確認です
2：for文の確認です
3：for文の確認です
4：for文の確認です
```

do は省略可能

### オブジェクトでの繰り返し

```ruby:
animals = ["dog","cat","pig","hippopotamus"]
for animal in animals
  puts animal
end
```

```:実行結果
dog
cat
pig
hippopotamus
```

from〜toの「..」も範囲オブジェクトを作成するものなので同じことみたい

## while文

指定した条件が満たされている間は繰り返しを続ける

```ruby:
i = 0
while i < 5
  puts "#{i}：while文の確認です"
  i += 1
end
```

```:実行結果
0：while文の確認です
1：while文の確認です
2：while文の確認です
3：while文の確認です
4：while文の確認です
```

for文と違いiの値は勝手に増えないので条件と繰り返したい処理を間違うと無限ループになる。

あまり上記のような使い方はよろしくなく、繰り返し回数などの条件以外で使用した方が良い。


```ruby:
sum = 1
while sum < 100
  puts sum
  sum += sum
end

puts "合計が#{sum}になりました"
```

```:実行結果
1
2
4
8
16
32
64
合計が128になりました
```

### 1行で書く
繰り返しの処理が１行しかない場合は以下のように書き換えられる

```ruby:
sum = 1
sum += sum while sum < 100
puts "合計が#{sum}になりました"
```

```:実行結果
合計が128になりました
```

### 処理の後で判定する
最低でも１回処理を実行したい場合の書き方

```ruby:
sum = 100
while sum < 100
  puts sum
  sum += sum
end

puts "合計が#{sum}になりました"
```

```:実行結果
合計が100になりました
```

先に判定されるので上記の場合は一度も処理されない。
処理後で判定するには以下のように記述

```ruby:
sum = 100
begin
  sum += sum
end while sum < 100

puts "合計が#{sum}になりました"
```

```:実行結果
合計が200になりました
```

## until文
指定した条件が満たされるまで繰り返しを続ける
whileを書き換えると以下のようになる

```ruby:
sum = 1
until sum >= 100
  puts sum
  sum += sum
end

puts "合計が#{sum}になりました"
```

```:実行結果
1
2
4
8
16
32
64
合計が128になりました
```

### 1行で書く
whileと同様に繰り返しの処理が１行しかない場合は以下のように書き換えられる

```ruby:
sum = 1
sum += sum until sum >= 100

puts "合計が#{sum}になりました"
```

```:実行結果
合計が128になりました
```

### 処理の後で判定する
whileと同様に最低でも１回処理を実行したい場合の書き方

```ruby:
sum = 100
begin
  sum += sum
end until sum >= 100

puts "合計が#{sum}になりました"
```

```:実行結果
合計が200になりました
```

## eachメソッド
主にオブジェクトの集まりに対して繰り返し処理を行う場合に使用される

```ruby:
animals = ["dog","cat","pig","hippopotamus"]
animals.each do |animal|
  puts animal
end
```

```:実行結果
dog
cat
pig
hippopotamus
```

do 〜 end　は　{ 〜 }　で書き換え可能。

for文の内部処理はeachメソッドが使用されている為、以下のような書き換えが可能。

```ruby:
(0..4).each do |i|
  puts "#{i}：eachメソッドの確認です"
end
```

```:実行結果
0：eachメソッドの確認です
1：eachメソッドの確認です
2：eachメソッドの確認です
3：eachメソッドの確認です
4：eachメソッドの確認です
```

### Prime#each
コメントにてご指摘頂きましたので追記。
指定された整数の値以下の素数を返してくれる。

```ruby:
require 'prime'

Prime.each(31) do |prime|
  p prime
end
```

```:実行結果
2
3
5
7
11
13
17
19
23
29
31
```

## loopメソッド
一度呼び出したら後戻りはできない悪魔のメソッド、使用は要注意

```ruby:
loop do
  print "すぐにけせ"
end
```

```:実行結果
ターミナルで実行したらcontrol + cが全然効かずmacがウーン言い出して軽く焦りました・・・
```