【Ruby】繰り返し処理をまるごと理解する10の手法 – Japanシーモア

【Ruby】繰り返し処理をまるごと理解する10の手法

初心者向けRuby繰り返し処理完全ガイドRuby
この記事は約14分で読めます。

 

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

このサービスは複数のSSPによる協力の下、運営されています。

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

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

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

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

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

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

はじめに

プログラミングには欠かすことができない要素の一つが、繰り返し処理です。

特定の処理を一定の条件下で反復的に実行するために、繰り返し処理は活用されます。

それはある一連のタスクを数回行う場合でも、何千回も同じ処理を行う場合でも同じです。

繰り返し処理をうまく使いこなすことで、コードは効率的で組みやすくなり、プログラムはスピーディに動作します。

この記事では、プログラミング言語Rubyでの繰り返し処理について詳しく解説します。

基本的な繰り返し処理から、配列やハッシュに対する繰り返し処理、そしてその応用まで、詳しく見ていきましょう。

また、サンプルコードとその説明を交えて、初心者の方でも理解しやすいように解説します。

●Rubyにおける繰り返し処理とは?

Rubyの繰り返し処理は、特定の処理を一定の条件下で反復的に行う機能です。

たとえば、ある数値から別の数値までの全ての整数に対して同じ処理を行いたい、あるいは配列の全ての要素に対して処理を行いたい、といった場合に利用します。

Rubyでは、様々な方法で繰り返し処理を行うことができます。

その主なものとして、times, upto, downto, stepといったメソッドがあります。

これらのメソッドを使って基本的な繰り返し処理を行ってみましょう。

●基本的な繰り返し処理

繰り返し処理は単純な作業から複雑なアルゴリズムまで、あらゆるプログラミングタスクにおいて中心的な役割を果たします。

Rubyは特に強力な繰り返し処理の構文を提供し、開発者がコードをシンプルかつ直観的に保つのを助けます。

ここでは、そのような基本的な繰り返し処理に必要なRubyの構文とメソッドを紹介し、より効果的なプログラミングができるようにします。

○timesメソッド

timesメソッドは、指定した回数だけブロック内の処理を繰り返します。

5.times do |i|
  puts "これは#{i+1}回目の繰り返しです。"
end

このコードでは、timesメソッドを使って5回の繰り返し処理を行っています。

ブロック変数iは0から始まり、繰り返すたびに1ずつ増加します。そのため、出力結果は次のようになります。

これは1回目の繰り返しです。
これは2回目の繰り返しです。
これは3回目の繰り返しです。
これは4回目の繰り返しです。
これは5回目の繰り返しです。

このように、timesメソッドを用いると、指定した回数だけ処理を繰り返すことが可能です。

○uptoメソッド

uptoメソッドは、指定した上限値までの数値に対して繰り返し処理を行います。

このメソッドは元の数値から始まり、上限値まで1ずつ増加しながらブロック内の処理を行います。

3.upto(7) do |i|
  puts "数値は現在#{i}です。"
end

このコードでは、uptoメソッドを使って、3から7までの数値に対して繰り返し処理を行っています。

ブロック変数iはこの範囲の各数値を通過するたびに更新され、その値を出力します。

したがって、出力結果は次のようになります。

数値は現在3です。
数値は現在4です。
数値は現在5です。
数値は現在6です。
数値は現在7です。

このように、uptoメソッドは始点から終点までの範囲で繰り返し処理を行うのに適しています。

○downtoメソッド

逆に、指定した下限値までの数値に対して繰り返し処理を行いたい場合は、downtoメソッドを使います。

このメソッドは元の数値から始まり、下限値まで1ずつ減少しながらブロック内の処理を行います。

5.downto(1) do |i|
  puts "カウントダウン#{i}"
end

このコードでは、downtoメソッドを使って、5から1までの数値に対して繰り返し処理を行っています。

ブロック変数iはこの範囲の各数値を通過するたびに更新され、その値を出力します。

したがって、出力結果は次のようになります。

カウントダウン5
カウントダウン4
カウントダウン3
カウントダウン2
カウントダウン1

このように、downtoメソッドはある数値から下へと範囲を繰り返し処理を行うのに適しています。

○stepメソッド

また、1ずつではなく、任意の間隔で数値を増減させたい場合は、stepメソッドを利用します。

このメソッドは、指定したステップ数ごとに繰り返し処理を行います。

1.step(10, 2) do |i|
  puts "現在の数値は#{i}です。"
end

このコードでは、stepメソッドを使って、1から10までの範囲を2つずつ飛ばしながら繰り返し処理を行っています。

ブロック変数iはこの範囲の各数値を通過するたびに更新され、その値を出力します。したがって、出力結果は次のようになります。

現在の数値は1です。
現在の数値は3です。
現在の数値は5です。
現在の数値は7です。
現在の数値は9です。

このように、stepメソッドは一定の間隔で繰り返し処理を行うのに適しています。

●配列に対する繰り返し処理

Rubyでは、配列に対しても繰り返し処理を行うことが可能です。

配列に対する繰り返し処理は非常に頻繁に行われるため、Rubyでは配列操作に特化したいくつかのメソッドが提供されています。

○eachメソッド

配列に対する最も基本的な繰り返し処理のメソッドはeachメソッドです。

このメソッドを使うと、配列の各要素に対して処理を行うことができます。

["りんご", "みかん", "ぶどう"].each do |fruit|
  puts "#{fruit}が好きです。"
end

このコードでは、eachメソッドを使って、配列の各要素に対して繰り返し処理を行っています。

ブロック変数fruitは配列の各要素を通過するたびに更新され、その値を出力します。

したがって、出力結果は次のようになります。

りんごが好きです。
みかんが好きです。
ぶどうが好きです。

このように、eachメソッドは配列の全要素に対して順に繰り返し処理を行うのに適しています。

このメソッドを用いることで、配列の要素それぞれに対する

操作を簡単に記述することができます。

○mapメソッド

配列の各要素に対して何らかの処理を行い、その結果を新しい配列として得たい場合はmapメソッドを利用します。

numbers = [1, 2, 3, 4, 5]
squared_numbers = numbers.map do |n|
  n ** 2
end
puts squared_numbers

このコードでは、mapメソッドを使って、配列numbersの各要素を二乗した新しい配列squared_numbersを作成しています。

ブロックの中で行われた処理の結果が新しい配列の要素となります。

したがって、出力結果は次のようになります。

[1, 4, 9, 16, 25]

このように、mapメソッドは各要素に対して何らかの処理を行い、その結果を新しい配列として取得するのに適しています。

○selectメソッド

また、配列の各要素に対して条件を満たすものだけを選択して新しい配列を作成するためにはselectメソッドを利用します。

numbers = [1, 2, 3, 4, 5]
even_numbers = numbers.select do |n|
  n % 2 == 0
end
puts even_numbers

このコードでは、selectメソッドを使って、配列numbersの各要素から偶数だけを選び出し新しい配列even_numbersを作成しています。

ブロックの中で行われた条件式が真となる要素だけが新しい配列の要素となります。

したがって、出力結果は次のようになります。

[2, 4]

このように、selectメソッドは配列の中から特定の条件を満たす要素だけを選び出すのに適しています。

このメソッドを用いることで、配列から条件に合った要素を簡単に取得することができます。

●ハッシュに対する繰り返し処理

Rubyでは、ハッシュ(キーと値の組み合わせでデータを管理するデータ構造)に対しても繰り返し処理を行うことができます。

ハッシュに対する繰り返し処理は非常に頻繁に行われるため、Rubyではハッシュ操作に特化したいくつかのメソッドが提供されています。

○eachメソッド

ハッシュに対する最も基本的な繰り返し処理のメソッドはeachメソッドです。

このメソッドを使うと、ハッシュの各キーと値に対して処理を行うことができます。

fruits_price = {"りんご" => 200, "みかん" => 100, "ぶどう" => 500}
fruits_price.each do |fruit, price|
  puts "#{fruit}の値段は#{price}円です。"
end

このコードでは、eachメソッドを使って、ハッシュfruits_priceの各キーと値に対して繰り返し処理を行っています。

ブロック変数fruitpriceはハッシュの各キーと値を通過するたびに更新され、その値を出力します。

したがって、出力結果は次のようになります。

りんごの値段は200円です。
みかんの値段は100円です。
ぶどうの値段は500円です。

このように、eachメソッドはハッシュの全要素(キーと値のペア)に対して順に繰り返し処理を行うのに適しています。

○each_keyメソッド

ハッシュの各キーに対してのみ何らかの処理を行いたい場合はeach_keyメソッドを利用します。

fruits_price = {"りんご" => 200, "みかん" => 100, "ぶどう" => 500}
fruits_price.each_key do |fruit|
  puts "#{fruit}を買いたいです。"
end

このコードでは、each_keyメソッドを使って、ハッシュfruits_priceの各キーに対して繰り返し処理を行っています。

ブロック変数fruitはハッシュの各キーを通過するたびに更新され、その値を出力します。

したがって、出力結果は次のようになります。

りんごを買いたいです。
みかんを買いたいです。
ぶどうを買いたいです。

このように、each_keyメソッドはハッシュの全キーに対して順に繰り返し処理を行うのに適しています。

○each_valueメソッド

一方、ハッシュの各値に対してのみ何らかの処理を行いたい場合はeach_valueメソッドを利用します。

fruits_price = {"りんご" => 200, "みかん" => 100, "ぶどう" => 500}
fruits_price.each_value do |price|
  puts "価格は#{price}円です。"
end

このコードでは、each_valueメソッドを使って、ハッシュfruits_priceの各値に対して繰り返し処理を行っています。

ブロック変数priceはハッシュの各値を通過するたびに更新され、その値を出力します。

したがって、出力結果は次のようになります。

価格は200円です。
価格は100円です。
価格は500円です。

このように、each_valueメソッドはハッシュの全値に対して順に繰り返し処理を行うのに適しています。

これらのメソッドを活用することで、ハッシュに対する各種操作を行いやすくなります。

●無限ループとブレイク

Rubyでは、条件によらず繰り返し処理を続ける無限ループを作ることも可能です。

無限ループはloopメソッドを使って作成します。

ただし、そのままではプログラムが終了せずに永遠に繰り返し続けてしまうため、何らかの条件でループを終了させる必要があります。

ループを終了させるためには、breakを使います。

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

このコードでは、無限ループを作成し、変数iの値を出力してから1増やすという処理を繰り返しています。

そして、iの値が5を超えた場合にbreakを実行し、ループを終了しています。

したがって、出力結果は次のようになります。

0
1
2
3
4
5

このように、loopbreakを組み合わせることで、任意の条件でループを終了させることができます。

このテクニックは、状態が変化するまで待機する場合など、条件が前もって定かでない状況で非常に役立ちます。

●繰り返し処理のネスト

Rubyでは、繰り返し処理を含む処理をさらに繰り返す、いわゆる繰り返し処理のネストも可能です。

これは2次元配列の操作や、行列の計算などに役立ちます。

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
matrix.each do |row|
  row.each do |element|
    puts element
  end
end

このコードでは、2次元配列(行列)matrixの各要素(行)に対する繰り返し処理を行い、さらにその中で行の各要素に対する繰り返し処理を行っています。

この結果、行列のすべての要素が順に出力されます。したがって、出力結果は次のようになります。

1
2
3
4
5
6
7
8
9

このように、繰り返し処理のネストを活用することで、2次元配列や行列のような複雑なデータ構造を操作することができます。

●繰り返し処理の注意点と対処法

Rubyの繰り返し処理は非常に強力であり、多くの事を行うことができますが、一部注意点があります。

例えば、繰り返し処理の中で配列やハッシュなどのコレクションを変更すると予期せぬ結果を招く可能性があります。

なぜなら、コレクションの変更が繰り返し処理に影響を与えるからです。

この問題を避ける一つの方法は、コレクションのコピーに対して操作を行うことです。

また、大きなデータに対して繰り返し処理を行うと、パフォーマンスやメモリ使用量に影響を与える可能性があります。

このような場合、一部のメソッド(例えば、配列のeachメソッドや範囲のeachメソッド)は”遅延評価”(必要になるまで評価を遅らせる)をサポートしています。

この機能を利用すると、大量のデータに対する繰り返し処理を効率的に行うこ

とができます。

●繰り返し処理の応用例

ここからは、Rubyの繰り返し処理を応用したいくつかの例を見てみましょう。

○ファクトリアルの計算

まずは、数学でよく使われるファクトリアルの計算です。

ファクトリアルは、1からその数までの自然数の積を指します。

例えば、5のファクトリアル(記号では5!)は、12345=120です。

これをRubyの繰り返し処理で計算してみましょう。

def factorial(n)
  result = 1
  (1..n).each do |i|
    result *= i
  end
  result
end

puts factorial(5)  # => 120

このコードでは、1から与えられた数nまでの範囲に対して繰り返し処理を行い、その積を計算しています。

これにより、任意の数のファクトリアルを計算することができます。

○フィボナッチ数列の生成

次に、フィボナッチ数列の生成を見てみましょう。

フィボナッチ数列は、前の2つの数の和が次の数になる数列です。

最初の2つの数は通常、0と1とされます。これをRubyの繰り返し処理で生成してみましょう。

def fibonacci(n)
  a, b = 0, 1
  n.times do
    a, b = b, a + b
  end
  a
end

puts fibonacci(10)  # => 55

このコードでは、繰り返し処理を使ってフィボナッチ数列の各項を生成しています。

これにより、フィボナッチ数列の任意の項を計算することができます。

○配列のカスタムソート

最後に、配列のカスタムソートを見てみましょう。

Rubyの配列にはsortメソッドがあり、これを使って要素をソートすることができます。

しかし、特殊な条件でソートしたい場合はどうでしょうか。

その場合、sort_byメソッドと繰り返し処理を使ってカスタムソートを行うことができます。

fruits = ["りんご", "みかん", "ぶどう"]
fruits.sort_by! do |fruit|
  fruit.length
end
puts fruits  # => ["みかん", "りんご", "ぶどう"]

このコードでは、sort_byメソッドを使って配列fruitsの要素をその長さに基づいてソートしています。

これにより、要素の長さが短い順に配列をソートすることができます。

まとめ

以上、Rubyにおける繰り返し処理について詳しく見てきました。

繰り返し処理はプログラミングにおいて非常に重要な要素であり、Rubyでは様々な繰り返し処理を行うためのメソッドが提供されています。

これらのメソッドを理解し、活用することで、より効率的で短いコードを書くことができます。

ハッシュの繰り返し処理にはeacheach_keyeach_valueなどのメソッドがあり、ループの中断にはbreak、無限ループの作成にはloopなどが利用できます。

また、繰り返し処理のネストや、繰り返し処理の注意点と対処法についても触れました。

そして最後に、これらを応用した例として、ファクトリアルの計算、フィボナッチ数列の生成、配列のカスタムソートを見てきました。

これらの知識を活用し、Rubyの繰り返し処理を上手に使いこなしてください。