Ruby初心者の為の繰り返し処理基礎

繰り返しとは、文字通り処理を繰り返すということをしたい場合に使われる仕組みです。ループ処理とも呼ばれています。

吉田先生

自分で作成したメソッドを使った繰り返し等もあるのですが、今回は既存のメソッドや構文を使った繰り返しについて学んでいきましょう。


繰り返しとは、文字通り処理を繰り返すということをしたい場合に使われる仕組みです。ループ処理とも呼ばれています。例を挙げると、             

  • 図形を5個表示したい
  • 配列の中のオブジェクトを入れ替える

このような事を行いたい場合などに使われます。自分で作成したメソッドを使った繰り返し等もあるのですが、今回は既存のメソッドや構文を使った繰り返しについて学んでいきましょう。繰り返しの為の構文とメソッドは以下の様なものがあります。

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

これらについて実際にコードを書きながら学んでいきましょう。

timesメソッド

timesメソッドは、指定した回数分だけ処理を繰り返すことのできるメソッドです。

書き方(構文)は以下のようになります。

(回数).times do
 処理  
end

では、皆さんも実際に以下のコードを実行してみましょう!

3.times do  #繰り返し回数を指定(3回)
  puts "サンプルテキスト"  #処理
end
#"サンプルテキスト"
#"サンプルテキスト"
#"サンプルテキスト"

指定した通り3回"サンプルテキスト"という文字列が出力されていればOKです!このような書き方の他に、こういった書き方も存在します。

(回数).times {
 処理
}

1行に抑えて書きたいときはこちらを使うと良いでしょう。そして、timesメソッドでは先ほどの様な繰り返しが何回行われているのかという事も出力する事が可能となっています。使い方としては、

(回数).times do |変数|
 処理
end

となります。では、以下のコードを実行してみましょう。

3.times do |i|  #回数と変数を指定
  puts "第 #{i} 位" #出力したい文字列の中に変数
end
# 0 
# 1 
# 2 

このように、〇(回数)~doの後に「|」バーティカルバーで変数を囲います。そして出力する際は、「#{変数}」という風に書きます。このようにすることで、変数に繰り返し回数を代入できるという訳です。

しかし、出力結果を見て頂ければ分かりますが、第1位から始まってほしいのですが、0位から始まってしまっていますね。これは、繰り返しの回数が0から始まるという決まりの為です。ですので、1から始めたい場合は以下の様なコードにします。

3.times do |i| 
  puts "第 #{i+1} 位" #変数+1とする
end
# 1 
# 2 
# 3 

処理を描く際に「#{変数+1}」とするのです。そうすると、きちんと第1位から始める事ができるんですね。

for文

こちらのfor文はメソッドではなく構文になります。このオブジェクトの部分に指定できるものは決まっており、以下のものが指定できます。

  • 配列
  • 範囲
  • ハッシュ

このfor文の書き方は以下のようになります。

for  変数  in  オブジェクト  do
 処理
end

*「do」は省略可能です。

では、配列を使用した場合で実際にコードを書いてみましょう。

names = ["山田", "斎藤", "加藤"]
for name in names
 puts name
end
#山田
#斎藤
#加藤

きちんと名前が1つ1つ取り出されていれば成功です。範囲オブジェクトの場合は

for num in 10..20
   処理
end

という形で、〇~〇という範囲指定を「..」を使い書きます。また、for文で使った変数はfor文の外側からも呼び出すことが可能です。

for  変数 in  オブジェクト
 処理1
end
 処理2

while文

while文は条件に当てはまっていれば、何度でも繰り返し実行されます。つまり、前章の条件判断で学びました真偽値が「true(真)」の間は繰り返されるというものです。

書き方は以下のようになります。

while  条件  do
 処理
end

*doは省略可能です。

例を使って試してみましょう。

x  =  1
while  x  <  5
 puts  x
  x  =  x + 1
end
#1
#2
#3
#4

皆さんもこちらを実行してみてください。それぞれのコードを説明しますと

1.変数xに1を代入

2.xが5より小さい場合という条件。条件判断が行われる。

3.2の条件式が「真」となる場合(xが5未満)は、処理が実行される

4.2~3を「真」の間繰り返し続ける

これは、値が「偽(xが5以上)」になると繰り返しが終了します。

until文

while文が条件に当てはまっている場合~という形だったのに対して、until文は条件に当てはまらない場合に繰り返しを行うというものです。ですので、「偽」の間はずっと繰り返し続け「真」となると繰り返しが終了するという事ですね。

書き方はほぼwhile文と同じです。

until  条件  do
 処理
end

*doは省略可能です。

では、実際にコードを実行してみましょう

x  =  1
until  x  >  3
 puts  x
  x  =  x + 1
end
#1
#2
#3

条件に当てはまった段階で繰り返しが終了していればOKです!

eachメソッド

eachメソッドは、配列や範囲オブジェクトなどの要素の集まりがあり、1つ1つの要素を取り出したい際などに使われます。

書き方としては以下のようになります。

オブジェクト.each do |変数|
 処理
end

オブジェクト.each {|変数|
 処理
}

timesメソッドのように2通りの書き方があります。では実際コードを実行し、配列オブジェクトの場合と範囲オブジェクトの場合、両方を試してみましょう。

#範囲オブジェクトの場合
num = 1..3  #範囲オブジェクトを変数numに代入
num.each do |x|  #取り出した要素を変数xに代入
 puts x
end
#1
#2
#3

#配列オブジェクトの場合
names = ["山田", "斎藤", "加藤"]  #配列を変数namesに代入

names.each do |name|  #取り出した要素を変数nameに代入
  puts name
end
#山田
#斎藤
#加藤

きちんと順番に取り出されていればOKです。

loopメソッド

loopメソッドとは他の繰り返しと違い無限に繰り返しが行われるメソッドです。

書き方は以下のようになります。

loop  do 
 puts  "Hello"
end

無限に、と申し上げましたがこのloopメソッド自体には終了というものがないだけであり、以下の方法で繰り返しの制御(繰り返すことを終了)を行う事が出来ます。

制御

loopメソッド等を使うときに、処理を途中で終了させたいといったことがあるかと思います。そういったときには、繰り返し制御文を使います。制御文には以下の様なものが有ります。

  • break
  • next
  • redo

この中から実際によく使われている、「break」と「next」について学んでいきましょう。

break

breakを使うと、繰り返しが終了します。この項目では繰り返しの中でif文を使いその中に「break」を記述する例をご紹介します。

コードにしますと

break.rb

snacks  =  ["チョコレート", "ポテトチップス", "グミ", "飴"]
rank = 0

snacks.each do |snack|
  rank = rank + 1
  if rank == 4
   break
  end
  puts "#{rank}位", snack
end
#1
#チョコレート
#2
#ポテトチップス
#3
#グミ

このような書き方になります。if~endの中で、もし〇〇なら繰り返しを終了するという事が書かれていますね。皆さんもこの例を実行してみましょう。人気のお菓子rankingの3位までが出力される結果になっていればOKです!

next

nextを使うと、繰り返しの中でnext以降の処理が飛ばされ繰り返しに戻ります。こちらでもif文の中で使う例をご紹介します。

では、実際にコードを書いてみましょう!

next.rb

snacks = ["チョコレート", "ポテトチップス", "グミ", "飴"]
rank = 0

snacks.each do |snack|
  rank = rank + 1
 if rank == 3
    next
  end
  puts "#{rank}位", snack
end
#1
#チョコレート
#2
#ポテトチップス
#4
#

「rank」の値が3、つまり配列の中の3つめの要素の時は「puts "#{rank}位", snak」が飛ばされるということですね。3位のグミのみ飛ばされていればOKです!

使い分け

これまで繰り返しを行う事の出来る構文やメソッドがいくつか出てきましたが、使い分けに迷う場面が出てくるかもしれません。その様な時は以下の目安を参考にして頂ければと思います。

times 繰り返し回数を指定したい
for オブジェクトの要素を取り出したい
while 詳しく条件を設定したい
until while文では分かりづらくなってしまう構文
each オブジェクトの要素を取り出したい
loop 繰り返し回数を指定したくない

until文にて構文(書いたコード)が分かりづらくなってしまう場合という事を申し上げましたが、これは「シンタックスシュガー」と呼ばれ、〇〇と書くよりも〇〇と書いた方が分かりやすく書けるというものです。eachとforでは、同じ理由を記載していますがシンタックスシュガーという言葉を使い説明すると、for文はeachメソッドのシンタックスシュガーとなります。

まとめ

繰り返しとは処理の繰り返しのことを指します。繰り返しの為の構文やメソッドを使用し、プログラムの内容によって使い分け使用していきます。

無料ビデオ講座のお知らせ

Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。

無料講座一覧を見る

×