93
89

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 5 years have passed since last update.

Ruby 繰り返し

Last updated at Posted at 2017-07-02

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

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

timesメソッド

一定の回数を繰り返す場合に使用する

指定回数を繰り返す

5.times do
  puts "timesメソッドの確認です"
end
実行結果
timesメソッドの確認です
timesメソッドの確認です
timesメソッドの確認です
timesメソッドの確認です
timesメソッドの確認です

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

i = 5
i.times do
  puts "timesメソッドの確認です"
end
実行結果
timesメソッドの確認です
timesメソッドの確認です
timesメソッドの確認です
timesメソッドの確認です
timesメソッドの確認です

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

繰り返し回数を知る

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

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と同じことをするには

for i in 0..4 do
  puts "#{i}:for文の確認です"
end
実行結果
0:for文の確認です
1:for文の確認です
2:for文の確認です
3:for文の確認です
4:for文の確認です

do は省略可能

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

animals = ["dog","cat","pig","hippopotamus"]
for animal in animals
  puts animal
end
実行結果
dog
cat
pig
hippopotamus

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

while文

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

i = 0
while i < 5
  puts "#{i}:while文の確認です"
  i += 1
end
実行結果
0:while文の確認です
1:while文の確認です
2:while文の確認です
3:while文の確認です
4:while文の確認です

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

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

sum = 1
while sum < 100
  puts sum
  sum += sum
end

puts "合計が#{sum}になりました"
実行結果
1
2
4
8
16
32
64
合計が128になりました

1行で書く

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

sum = 1
sum += sum while sum < 100
puts "合計が#{sum}になりました"
実行結果
合計が128になりました

処理の後で判定する

最低でも1回処理を実行したい場合の書き方

sum = 100
while sum < 100
  puts sum
  sum += sum
end

puts "合計が#{sum}になりました"
実行結果
合計が100になりました

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

sum = 100
begin
  sum += sum
end while sum < 100

puts "合計が#{sum}になりました"
実行結果
合計が200になりました

until文

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

sum = 1
until sum >= 100
  puts sum
  sum += sum
end

puts "合計が#{sum}になりました"
実行結果
1
2
4
8
16
32
64
合計が128になりました

1行で書く

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

sum = 1
sum += sum until sum >= 100

puts "合計が#{sum}になりました"
実行結果
合計が128になりました

処理の後で判定する

whileと同様に最低でも1回処理を実行したい場合の書き方

sum = 100
begin
  sum += sum
end until sum >= 100

puts "合計が#{sum}になりました"
実行結果
合計が200になりました

eachメソッド

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

animals = ["dog","cat","pig","hippopotamus"]
animals.each do |animal|
  puts animal
end
実行結果
dog
cat
pig
hippopotamus

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

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

(0..4).each do |i|
  puts "#{i}:eachメソッドの確認です"
end
実行結果
0:eachメソッドの確認です
1:eachメソッドの確認です
2:eachメソッドの確認です
3:eachメソッドの確認です
4:eachメソッドの確認です

Prime#each

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

require 'prime'

Prime.each(31) do |prime|
  p prime
end
実行結果
2
3
5
7
11
13
17
19
23
29
31

loopメソッド

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

loop do
  print "すぐにけせ"
end
実行結果
ターミナルで実行したらcontrol + cが全然効かずmacがウーン言い出して軽く焦りました・・・
93
89
3

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
93
89

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?