読み込み中...

Rubyを使ったループ制御の全て!15の実践サンプルコードで学ぶ

Rubyのループ制御を学ぶための記事 Ruby
この記事は約14分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Rubyを使ったループ制御の全てを理解したい方、必見です。

初心者でも理解できるよう基本から解説します。

さらに15の実践的なサンプルコードを用いて、詳細な使い方や注意点、カスタマイズ方法もご紹介します。

本記事を読み終える頃には、Rubyのループ制御についてより深く理解できるはずです。

●Rubyとは

Rubyは、まつもとゆきひろ氏によって開発された、オブジェクト指向スクリプト言語の一つです。

シンプルで読みやすく、書きやすいことが特徴です。

プログラミング初心者からプロの開発者まで、幅広いユーザーに愛されています。

●ループ制御とは

ループ制御とは、一連の命令を繰り返し実行するためのプログラミングの構造のことを指します。

Rubyでは主にwhile文、for文、timesメソッドを用いてループ制御を行います。

○while文の基本

while文は、指定した条件が真である限り、繰り返し処理を行うための文です。

具体的な使用方法は次の通りです。

while 条件 do
  # 実行する処理
end

ここで、”条件”には真または偽を返す式を指定します。

式が真である場合、ブロック内の処理を繰り返し実行します。

式が偽になると、繰り返しを終了し、while文の次の行に移ります。

○for文の基本

for文は、特定の範囲内で繰り返し処理を行うための文です。

Rubyでは次のように使用します。

for 変数 in 範囲 do
  # 実行する処理
end

“範囲”には繰り返し処理を行う範囲を指定します。

範囲は通常、範囲オブジェクト(例:1..5)や配列を用います。

指定した範囲の各要素に対してブロック内の処理を実行します。

○timesメソッドの基本

timesメソッドは、特定の回数だけ繰り返し処理を行うメソッドです。

次のように使用します。

回数.times do
  # 実行する処理
end

ここで、”回数”には繰り返し処理を行う回数を指定します。

指定した回数だけブロック内の処理を繰り返し実行します。

以上、Rubyでよく使われる3種類のループ制御(while文、for文、timesメソッド)の基本について説明しました。

次に、これらの詳細な使い方を見ていきましょう。

●詳細な使い方

○while文の詳細な使い方

while文は条件が真である限り、繰り返し処理を行いますが、ここでは詳細な使い方について見ていきましょう。

□サンプルコード1:無限ループからの脱出

このコードでは、無限ループから脱出するためのコードを表しています。

この例では、ループカウンタとして変数iを使用し、iの値が5以上になった時点でループを抜け出します。

i = 0
while true do
  puts i
  i += 1
  if i >= 5
    break
  end
end

このコードを実行すると、0から4までの数字が順番に出力されます。

iが5以上になった時点で、if文の中のbreakが実行され、while文から抜け出します。

無限ループから脱出するために、特定の条件を満たしたときにbreakを使ってループを終了するという技術は、プログラミングにおいて頻繁に利用されます。

□サンプルコード2:配列の要素を順番に出力

このコードでは、配列の各要素をwhile文を使って順番に出力する方法を表しています。

この例では、配列の要素を順に取り出すためにインデックスとして変数iを使用しています。

words = ["apple", "banana", "cherry"]
i = 0
while i < words.length do
  puts words[i]
  i += 1
end

このコードを実行すると、配列に含まれる各単語(”apple”, “banana”, “cherry”)が順番に出力されます。

ここではwhile文の条件としてiが配列の長さより小さい間、という条件を指定しています。

iの初期値は0で、各ループの最後で1が加算されます。

これにより、配列の各要素が順番に取り出されています。

○for文の詳細な使い方

Rubyのfor文は、指定した範囲内で繰り返し処理を行うための文です。

その使用方法を具体的なコードと共に詳しく見ていきましょう。

□サンプルコード3:範囲オブジェクトと組み合わせて使う

このコードでは、範囲オブジェクトと組み合わせてfor文を使って繰り返し処理を行う方法を表しています。

この例では、1から5までの範囲を指定しています。

for i in 1..5 do
  puts i
end

このコードを実行すると、1から5までの数字が順番に出力されます。

ここでは範囲オブジェクト(1..5)を指定して、その範囲内の各数値に対してブロック内の処理(数値の出力)を行っています。

このように、for文は範囲オブジェクトと組み合わせることで、指定した範囲の値に対する繰り返し処理を簡単に行うことができます。

□サンプルコード4:二次元配列を扱う

このコードでは、for文を使って二次元配列を扱う方法を表しています。

この例では、二次元配列の各要素に対して繰り返し処理を行っています。

array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for sub_array in array do
  for num in sub_array do
    puts num
  end
end

このコードを実行すると、1から9までの数字が順番に出力されます。

この例では、for文を二重に使うことで二次元配列を扱っています。

一番外側のfor文では、arrayの各要素(つまり、配列)を取り出し、内側のfor文では、その配列の各要素を取り出しています。

これにより、二次元配列の各要素に対する処理を繰り返し行うことができます。

○timesメソッドの詳細な使い方

Rubyには特定の回数だけ繰り返し処理を行うための、非常に便利なメソッドが存在します。

それがtimesメソッドです。

このメソッドは数値オブジェクトに対して使うことができ、その数値の回数だけブロック内の処理を繰り返します。

□サンプルコード5:指定回数だけ繰り返し処理を実行

このコードでは、timesメソッドを使って指定した回数だけ繰り返し処理を行う方法を表しています。

この例では、5回”Hello, world!”を出力しています。

5.times do
  puts "Hello, world!"
end

このコードを実行すると、”Hello, world!”が5回出力されます。

timesメソッドは、その名前の通り、指定した回数だけ処理を「繰り返す」ためのメソッドです。

5.timesとすることで、その後のブロックを5回繰り返す、という動作を行います。

□サンプルコード6:カウンター変数を利用する

このコードでは、timesメソッド内でカウンター変数を利用する方法を表しています。

この例では、5回繰り返し処理を行い、その中で現在の繰り返し回数を出力しています。

5.times do |i|
  puts "This is iteration number #{i+1}"
end

このコードを実行すると、”This is iteration number 1″から”This is iteration number 5″までが順に出力されます。

ここでは、ブロック引数iを利用して現在の繰り返し回数を取得しています。

timesメソッドは0から始まるので、出力を人間が理解しやすい1から始まる形式にするために、iに1を足しています。

このように、timesメソッドは指定した回数だけ繰り返し処理を行うための便利なメソッドであり、ブロック引数を利用することで現在の繰り返し回数も取得することができます。

特に、一定の回数だけ処理を行う必要がある場合には、このtimesメソッドを利用するとコードがシンプルになり、読みやすくなります。

●詳細な対処法

ループ制御は非常に便利な機能ですが、正しく扱わなければ無限ループを引き起こすなどの問題を引き起こす可能性があります。

そのため、次に、いくつかの代表的な問題とその対処法について説明します。

○無限ループの対処法

プログラミングにおける最も一般的な問題の一つは無限ループです。

これは、ループが終了条件を満たさないために、永遠に続いてしまう状況を指します。

Rubyにおいては、この問題を避けるための方法がいくつかあります。

□サンプルコード7:ループの中断と再開

このコードでは、breakとnextを使ってループの中断と再開を行う方法を表しています。

この例では、10回のループの中で、5回目でループを一時中断し、再開しています。

10.times do |i|
  if i == 4
    break
  end
  puts "Iteration #{i+1}"
end

上記のコードを実行すると、”Iteration 1″から”Iteration 4″までが出力され、その後ループが中断します。

breakを使うことで、それ以降のループを全てスキップして処理を終了することができます。

□サンプルコード8:ループのスキップ

次に、特定の条件を満たす場合に一部のループをスキップする方法を見てみましょう。

10.times do |i|
  if i == 4
    next
  end
  puts "Iteration #{i+1}"
end

上記のコードを実行すると、”Iteration 1″から”Iteration 3″、”Iteration 5″から”Iteration 10″までが出力され、”Iteration 4″の出力はスキップされます。

nextを使うことで、そのループだけをスキップし、次のループに進むことができます。

無限ループは、ループが止まらないためにリソースを過剰に消費し、プログラムが正常に機能しなくなる可能性があります。

そのため、必要に応じてループを中断したり、特定のループだけをスキップしたりすることで、無限ループを避けることができます。

○エラーハンドリングの対処法

Rubyにおけるエラーハンドリングは非常に重要です。

特に、ループ処理中に例外が発生した場合、それを適切に捕捉しなければ、全体のプログラムが停止してしまう可能性があります。

□サンプルコード9:begin/rescueを使ったエラーハンドリング

このコードでは、begin/rescueを用いてループ中の例外処理を行う方法を表します。

この例では、5回のループ中で、3回目に例外を発生させ、その例外を捕捉しています。

5.times do |i|
  begin
    if i == 2
      raise "An error occurred!"
    end
    puts "Iteration #{i+1}"
  rescue => e
    puts e.message
  end
end

上記のコードを実行すると、”Iteration 1″、”Iteration 2″、”An error occurred!”、”Iteration 4″、”Iteration 5″という出力が得られます。

これは、3回目のループで発生した例外を捕捉し、そのメッセージを出力してから、次のループに移行しているからです。

●詳細な注意点

Rubyのループ制御を利用する際には、いくつかの注意点があります。

ループ変数のスコープとループのネストについて、詳しく説明していきます。

○サンプルコード10:ループ変数のスコープについて

このコードでは、ループ変数のスコープについて説明しています。

この例では、ループの外と内で同じ名前の変数を使用しています。

x = 10
5.times do |x|
  puts "Inside the loop: #{x}"
end
puts "Outside the loop: #{x}"

このコードを実行すると、”Inside the loop: 0″から”Inside the loop: 4″までの出力の後に、”Outside the loop: 10″と出力されます。

これは、ループの内部で定義されたxと、ループの外部で定義されたxが別のスコープを持つためです。

○サンプルコード11:ループのネストについて

次に、ループのネストについて見てみましょう。

ループのネストとは、ループの中にさらに別のループを書くことを指します。

このコードでは、外側のループと内側のループでループ変数をどのように使用するかを説明しています。

3.times do |i|
  2.times do |

j|
    puts "i: #{i}, j: #{j}"
  end
end

このコードを実行すると、それぞれのループ変数iとjの組み合わせが出力されます。

つまり、”i: 0, j: 0″、”i: 0, j: 1″、”i: 1, j: 0″、”i: 1, j: 1″、”i: 2, j: 0″、”i: 2, j: 1″という6つの組み合わせが出力されます。

●詳細なカスタマイズ

Rubyのループ制御では、ループのカウンターを自由にカスタマイズしたり、独自のループ制御を作ることも可能です。

それぞれの方法について具体的なコードを用いて説明していきます。

○サンプルコード12:ループのカウンターをカスタマイズ

このコードでは、Rubyの範囲オブジェクトを使ってループのカウンターをカスタマイズする方法を表しています。

この例では、2から10までの間で、2つずつ増加するループを作成しています。

(2..10).step(2) do |i|
  puts "Iteration #{i}"
end

上記のコードを実行すると、”Iteration 2″、”Iteration 4″、”Iteration 6″、”Iteration 8″、”Iteration 10″という出力が得られます。

これは、2から始まり、2つずつ増加するループを行っているからです。

○サンプルコード13:独自のループ制御を作る

Rubyでは、独自のループ制御を作ることも可能です。

これは、Rubyがイテレータを用いたループ制御をサポートしているからです。

このコードでは、配列の各要素に対して特定の処理を行うカスタムループを作成しています。

def custom_loop(array)
  index = 0
  while index < array.length
    yield array[index]
    index += 1
  end
end

custom_loop([1, 2, 3, 4, 5]) do |item|
  puts "Processing item: #{item}"
end

このコードを実行すると、”Processing item: 1″から”Processing item: 5″までのメッセージが順番に出力されます。

このループは、配列の各要素に対して一連の処理(この場合は出力)を行います。

●応用例とサンプルコード

これまでの知識を活かして、いくつかの実用的なサンプルコードを見てみましょう。

これらのコードは、ループ制御の基本的な知識を応用したもので、プログラミング初心者がよく遭遇する問題を解決します。

○サンプルコード14:FizzBuzz問題の解決

FizzBuzzはプログラミングの初学者がよく出会う問題で、繰り返し処理の理解を試すための一般的な問題です。

このコードでは、1から100までの数で、3で割り切れる場合は「Fizz」、5で割り切れる場合は「Buzz」、両方で割り切れる場合は「FizzBuzz」を出力するFizzBuzz問題を解決します。

(1..100).each do |i|
  if i % 3 == 0 && i % 5 == 0
    puts 'FizzBuzz'
  elsif i % 3 == 0
    puts 'Fizz'
  elsif i % 5 == 0
    puts 'Buzz'
  else
    puts i
  end
end

このコードを実行すると、1から100までの数に対してFizzBuzzの条件を満たすかどうかをチェックし、条件によって適切な文字列を出力します。

○サンプルコード15:素数を求める

次のコードでは、Rubyのループ制御を使って特定の範囲内の素数を求める方法を紹介します。

この例では、1から100までの素数を求めます。

def prime_numbers(max)
  (2..max).select do |n|
    (2..Math.sqrt(n)).none? { |i| n % i == 0 }
  end
end

puts prime_numbers(100)

上記のコードを実行すると、1から100までの範囲内の素数が出力されます。

これは、各数字が2からその数字の平方根までのいずれの数字でも割り切れない場合、その数字は素数と見なすという原理に基づいています。

まとめ

この記事では、Rubyのループ制御の基本から詳細な使い方、さらに15の実践的なサンプルコードを用いて解説しました。

Rubyのループ制御は強力で柔軟性があり、初心者から経験豊富なプログラマまで、日々のコーディング作業を助けます。

以上の情報が、あなたがループ制御をより深く理解し、効果的に活用するための手助けとなれば幸いです。