目次
開発環境
- Ruby version: ruby 3.1.2
Rubyのfor文とは
Rubyのfor文とは、オブジェクトに対して繰り返し処理を行うことができる制御構文です。
指定したオブジェクトに含まれている要素を順番に取り出し、取り出した要素に対して繰り返し処理を行い、オブジェクトの要素が全て取り出されるまで処理が繰り返されます。
公式リファレンス:https://docs.ruby-lang.org/ja/3.1/doc/spec=2fcontrol.html#for
Rubyのfor文の書き方
Rubyのfor文の書き方を「for文の基本形」「for文の省略形」をご紹介します。
Rubyのfor文の基本形
1 2 3 | for 変数 in オブジェクト do 実行する処理 end |
「in」のあとに指定したオブジェクトの要素を順番に変数に代入し、「do」から「end」までの処理を実行します。
for文は、変数に代入するオブジェクトの要素が全て取り出されるまで処理が繰り返されます。
Rubyのfor文の省略形
1 2 3 | for 変数 in オブジェクト 実行する処理 end |
Rubyのfor文はdoを省略することができます。
実際の開発ではdoを省略して書くことがほとんどなので、省略形で覚えるのがおすすめです。
Rubyのfor文の使い方
Rubyのfor文のよくあるパターンをサンプルコードを用いて使い方の解説をしていきます。
for文で範囲オブジェクトを繰り返し処理するパターン
まずはfor文のオブジェクトに範囲オブジェクトを指定して繰り返し処理をするパターンです。
1 2 3 | for num in 1..5 puts "#{num}回目の処理です。" end |
範囲オブジェクトを指定することで、処理を決まった回数だけ繰り返すことができます。
上記は1から5までの範囲オブジェクトが順番に取り出されて変数numに代入され、範囲オブジェクトの値がなくなるまで処理を繰り返し行います。
for文で配列を繰り返し処理するパターン
次にfor文のオブジェクトに配列を指定して繰り返し処理をするパターンです。
1 2 3 4 5 | array = ['山田', '佐藤', '鈴木', '田中'] for name in array puts "お名前は#{name}さんです。" end |
上記は変数arrayに代入されている配列の要素に名前がまとめられています。
for文で1回目は山田、2回目は佐藤、3回目は鈴木、4回目は田中という順番に取り出されて変数nameに代入され、配列の要素がなくなるまで処理を繰り返し行います。
また、for文のオブジェクトに2次元配列を指定して繰り返し処理するパターンもあります。
1 2 3 4 5 6 7 8 9 10 | array = [ ['山田', 25, "男性"], ['佐藤', 24, "女性"], ['鈴木', 30, "男性"], ['田中', 28, "女性"] ] for name, age , sex in array puts "#{name}さんは#{age}歳の#{sex}です。" end |
上記は配列の中の配列がある状態ですが、1回目は['山田', 25, "男性"]、2回目は['佐藤', 24, "女性"]、3回目は['鈴木', 30, "男性"]、4回目は['田中', 28, "女性"]が順番に取り出されます。
そのため、1回目の配列のインデックス番号0を変数name、インデックス番号1を変数age、インデックス番号2を変数sexに代入するという形で入れ子になった要素をそれぞれ代入することができます。
for文でハッシュを繰り返し処理するパターン
次にfor文のオブジェクトにハッシュを指定して繰り返し処理をするパターンです。
1 2 3 4 5 | hash = {name: "山田", age: 25, sex: "男性"} for key, value in hash puts "#{key}は#{value}です。" end |
上記はハッシュの要素を順番に取り出してキーと値をそれぞれループ変数key, valueに代入して処理を繰り返します。
また、for文のオブジェクトに連想配列の配列を指定して繰り返し処理するパターンもあります。
1 2 3 4 5 6 7 8 9 10 | hash = [ {name: "山田", age: 25, sex: "男性"}, {name: "佐藤", age: 24, sex: "女性"}, {name: "鈴木", age: 30, sex: "男性"}, {name: "田中", age: 28, sex: "女性"}, ] for person in hash puts "#{person[:name]}さんは#{person[:age]}歳の#{person[:sex]}です。" end |
上記は2次元配列と同様ですが、ハッシュにはキーと値が割り当てられているため、変数personに代入されたハッシュにkeyを指定することでvalueを取り出しています。
Rubyのfor文とeachメソッドの違い
Rubyのfor文とeachメソッドはどちらもオブジェクトに対して繰り返し処理を行います。
そのなかでもfor文とeachメソッドの大きな違いとしては、変数が処理の中のみ有効か、それとも処理の外でも有効かという有効範囲(スコープ)が異なる点です。
for文:処理の外でも有効
eachメソッド:処理の中のみ有効
for文の場合は、以下のコードのようにfor文で定義した変数(i,total)をfor文の外からでも参照することができます。
1 2 3 4 5 6 7 | for i in [10, 20, 30] total = 0 if total.nil? total += i end puts total puts i |
しかしeachメソッドの場合は、変数(i,total)のスコープはブロック(do~end)内になるのでブロック外から参照しようとするとエラーが発生します。
1 2 3 4 5 6 7 | [10, 20, 30].each do |i| total = 0 if total.nil? total += i end puts total puts i |
このようにfor文とeachメソッドは同じように繰り返し処理ができますが、変数のスコープが違うということに気をつけてください。
おわりに
Rubyのeachメソッドの使い方を解説してきました。
どのようなプログラミング言語でも言えますが、どのようなパラーメータでデータが送られているかによって適切な処理が変わります。
Rubyには繰り返し処理を行うメソッドは複数用意されていますが、eachメソッドは使用頻度がかなり高いため、是非、参考にしてください。