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