Ruby for文の使い方

この記事のポイント

  • 配列や範囲(Range)などのコレクションを順に処理するための繰り返し構文
  • eachメソッドと似た動作をするが、スコープの挙動が異なる特殊なループ構造
  • Rubyでは直接for文を使うより、イテレータメソッドを使う方が一般的

目次

Rubyのfor文とは?

Rubyのfor文は、配列や範囲(Range)などのコレクションの要素を、順番に処理していくための繰り返し構文です。他の多くのプログラミング言語にあるfor文と似た見た目をしていますが、Rubyならではの特徴も持っています。

for文の基本的な使い方は、配列や範囲内のすべての要素に対して、同じ処理を繰り返すことです。たとえば、配列の動物名を順に表示したり、1〜10の数字を順番に処理したりといった場面で活躍します。   

実はRubyのfor文は、内部的にはeachメソッドを使って動いています。たとえば、

for item in collection # 処理 end

というコードは、実質的に以下と同じ意味になります。

collection.each do |item| # 処理 end

ただし、変数のスコープ(有効範囲)には違いがあります。for文で使った変数はループの外でも引き続き使えますが、eachのブロック内で定義した変数は、そのブロックの外からは見えません。

Rubyでは、コードの読みやすさや柔軟さの面から、forよりもeachなどのイテレータメソッドを使うのが一般的です。ただ、C言語やJavaなど他の言語に慣れている人にとっては、for文のほうが直感的でわかりやすい場合もあるでしょう。

【関連】
Rubyをもっと詳しく学ぶならpaizaラーニング

for文の基本構文

Rubyのfor文は、配列や範囲(Range)などのコレクションから要素を1つずつ取り出して、順番に処理を行う構文です。基本の書き方は次のとおりです。

for 変数 in コレクション # 繰り返し実行される処理 end

配列の例

たとえば、配列の要素を順に表示するには、次のように書きます。    

for animal in ["ライオン", "トラ", "クマ"] puts animal end

範囲オブジェクトの例

範囲オブジェクト(Range)を使えば、連続した数値の処理も簡単です。    

for i in 1..5 puts "#{i}回目の処理" end

複数の変数を使った処理(ハッシュなど)

ハッシュのように、要素がキーと値のペアになっているコレクションも扱えます。

for key, value in {"犬" => "わんわん", "猫" => "にゃー"} puts "#{key}は#{value}と鳴きます" end

変数のスコープに注意

for文で使われた変数は、ループの外でも使えるという特徴があります。これはeachなどのブロック構文とは異なる点です。

for i in 1..3 value = i * 2 end puts "最後の値: #{value}" # ブロックの外でも変数valueを使用できる

空のコレクションでは実行されない

コレクションが空の場合、ループの中身は一度も実行されません。  

for item in [] puts "実行されません" end

実用例

Rubyのfor文は、さまざまな場面で繰り返し処理に使うことができます。ここでは、実際のコード例を通して使い方を見ていきましょう。

これから紹介するコードは、Rubyの対話環境(IRB)やRubyファイルにコピーして、すぐに試すことができます。特に初心者の方にとっては、実際に動かしてみることで理解が深まりやすくなります。

このセクションでは、シンプルな例から順を追って紹介していくので、ぜひご自身でも実行してみてください。

配列の繰り返し処理

まずは、配列を使ったfor文の基本的な使い方を見てみましょう。

配列に含まれる動物の名前を順番に取り出して、それぞれ表示するシンプルな例です。ループ処理の基本として、配列を順に処理したいときによく使われます。

animals = ["ゾウ", "キリン", "カバ", "ライオン"] for animal in animals puts "サファリで#{animal}を見ました" end

実行結果:

サファリでゾウを見ました
サファリでキリンを見ました
サファリでカバを見ました
サファリでライオンを見ました

このように、for文を使うと配列の各要素に順番にアクセスしながら処理を実行できます。

範囲オブジェクトを使ったfor文

範囲オブジェクト(Range)を使って指定した範囲の数値を繰り返し処理する例です。1..5 のような 範囲オブジェクト(Range) を使えば、決まった回数だけ繰り返し処理を行うことができます。

この例では、「1匹目」から「5匹目」まで、動物を順番に数える処理をfor文で実行しています。    

puts "動物園の動物を数えます" for count in 1..5 puts "#{count}匹目の動物を確認しました" end puts "合計5匹の動物がいます"

実行結果:

動物園の動物を数えます
1匹目の動物を確認しました
2匹目の動物を確認しました
3匹目の動物を確認しました
4匹目の動物を確認しました
5匹目の動物を確認しました
合計5匹の動物がいます

範囲オブジェクトを使うと、繰り返しの回数がはっきりしている場面で、すっきりとしたコードを書けます。

ハッシュの繰り返し処理

ハッシュでは、キーと値のペアをセットで扱えます。for文を使えば、それぞれのキーと値を取り出しながら、順に処理できます。
この例では、動物の名前(キー)と鳴き声(値)をセットにしたハッシュをfor文で繰り返しています。    

animal_sounds = {"イヌ" => "ワンワン", "ネコ" => "ニャー", "ウシ" => "モー"} for animal, sound in animal_sounds puts "#{animal}は#{sound}と鳴きます" end

実行結果:

イヌはワンワンと鳴きます
ネコはニャーと鳴きます
ウシはモーと鳴きます

ハッシュのfor文では、1つのループでキーと値の両方を扱えるので、とても効率的です。データの関連性を保ったまま処理したいときに便利ですね。

for文の変数スコープ

Rubyのfor文では、ループ内で使った変数がループの外でも使えるという特徴があります。

これは、eachメソッドとの大きな違いです。eachではブロックの中で定義した変数は、そのブロックの外からは見えなくなりますが、for文ではスコープが広いため、外でもその変数にアクセスできます。

以下の例では、ループの外で変数 last_animal を使っています。

animals = ["パンダ", "コアラ", "カンガルー"] last_animal = "不明" for animal in animals last_animal = animal end puts "最後に処理した動物: #{last_animal}"

実行結果:

最後に処理した動物: カンガルー

このように、for文で使った変数はループ終了後にも参照できます。ループ内で決まった値を後で使いたいといった場合に便利です。

ネストしたfor文

for文の中にさらにfor文を入れて、複数の階層を持つデータ(多次元配列など)を順番に処理することもできます。これをネスト(入れ子)したfor文と呼びます。

以下の例では、「動物園のエリア」と「そこにいる動物たち」の情報を表示しています。

zoo_areas = [ ["サバンナ", ["ライオン", "キリン"]], ["極地", ["ペンギン", "ホッキョクグマ"]] ] for area, animals in zoo_areas puts "#{area}エリアの動物たち:" for animal in animals puts "- #{animal}" end end

実行結果:

サバンナエリアの動物たち:
- ライオン
- キリン
極地エリアの動物たち:
- ペンギン
- ホッキョクグマ

このように、外側のループでエリア名を処理し、内側のループで動物の名前を処理することで、階層的なデータも分かりやすく扱えます。

nextとbreakによる制御

for文の中では、条件に応じてループをスキップしたり途中で終了したりすることができます。そのために使うのが、next と break です。

  • next:現在の処理をスキップして、次のループへ進みます
  • break:ループそのものを終了して抜け出します

以下の例では、動物の名前に応じて処理を分けています。

animals = ["トラ", "ヘビ", "ウサギ", "ワニ", "リス"] for animal in animals if animal == "ウサギ" puts "#{animal}は安全なのでスキップします" next end if animal == "ワニ" puts "#{animal}は危険です!中止します" break end puts "#{animal}は注意が必要です" end

実行結果:

トラは注意が必要です
ヘビは注意が必要です
ウサギは安全なのでスキップします
ワニは危険です!中止します

このように、nextとbreakを使えば、特定の条件だけを処理から除外したり、緊急時にループを止めるといった制御が簡単に行えます。

for文の戻り値

Rubyのfor文は、実行結果として処理対象のコレクション(配列など)そのものを返すという特徴があります。これは、ループで処理を行うだけでなく、そのまま元のデータを戻り値として使えるということです。

次の例では、for文を使って配列の各要素を表示しつつ、その戻り値を変数に代入しています。

animals = ["キツネ", "タヌキ", "イタチ"] result = for animal in animals puts "日本の野生動物: #{animal}" end puts "for文の戻り値: #{result.inspect}" puts "元の配列と同じか: #{result == animals}"

実行結果:

日本の野生動物: キツネ
日本の野生動物: タヌキ
日本の野生動物: イタチ
for文の戻り値: ["キツネ", "タヌキ", "イタチ"]
元の配列と同じか: true

このように、for文の結果として元の配列が返ってくるため、ループ処理と戻り値の利用を同時に行うといった使い方が可能です。とはいえ、戻り値を活用するケースはそれほど多くないかもしれませんが、Rubyの文法として覚えておくと役立つでしょう。

for文とeachの違い

Rubyでは繰り返し処理にfor文とeachメソッドのどちらも使えますが、変数のスコープに大きな違いがあります。

for文のスコープ

for文で使われた変数はループの外でもそのまま使えます。これは他の多くのプログラミング言語とは少し違う特徴です。

animals = ["フクロウ", "カラス", "ワシ"] # for文の場合 for bird in animals bird_type = "猛禽類" end puts "for文の後: #{bird}は#{bird_type}です"

この例では、birdやbird_typeといった変数がfor文のループの外でも使えていることがわかります。

eachメソッドのスコープ

一方、eachメソッドではブロック内で使われる変数はブロックの外からは参照できません。これはスコープ(変数の有効範囲)がブロック内に限定されているためです。

# eachの場合 - 変数スコープが異なる animals.each do |bird| bird_species = "鳥類" end # ここでbird_speciesを使うとエラーになる

実行結果:

for文の後: ワシは猛禽類です

このように、for文とeachでは変数が有効な範囲が異なる点に注意が必要です。

実務ではeachが主流

Rubyでは、コードの可読性やRubyらしい書き方の観点から、eachメソッドを使った繰り返し処理が推奨されることが多いです。ただし、スコープの違いを理解しておくことで、状況に応じてfor文を選ぶこともできます。

まとめ

Rubyのfor文は、配列や範囲などのコレクションを順番に処理できる基本的な繰り返し構文です。

ループの中で使った変数がループの外でも使えるという特徴があり、eachメソッドとの違いのひとつとなっています。

Rubyではeachなどのイテレータメソッドの使用が一般的ですが、for文は他の言語にもよく似た構文なので、Ruby初心者や他言語経験者にも親しみやすい書き方です。

また、breakやnextでの制御、ネスト構造での多次元データ処理など、さまざまな場面で活用できます。

Rubyを学び始めたばかりの方は、for文とeachの使い分けを理解しながら練習することで、より柔軟で効率的なコードが書けるようになるでしょう。

レベルを更に上げたい方はpaizaプログラミングスキルチェックへ

  1. paizaラーニングトップ
  2. リファレンス
  3. Rubyのリファレンス記事一覧
  4. Ruby for文の使い方