本記事では、Rubyで繰り返し処理をするときに使うeachを解説します。
eachを使い、配列やハッシュ(Rubyにおける連想配列です)の要素を全て処理するといったことが可能です。またeachの使い方だけでなく、範囲オブジェクトやtimesメソッドといったRubyらしい特徴も解説していきます。
本記事を読み終えると、eachを使った基本的な実装、プラスアルファで、繰り返し処理における「Rubyらしい特徴」が理解できていますよ!
Rubyにおけるeachとは?
前述のように、eachとはオブジェクトにおける繰り返し処理に使います。まずは基本構文を見てみましょう。
[基本構文]
# eachの基本構文 オブジェクト.each do |変数| # 繰り返したい処理 end
オブジェクトの要素が変数の中に入り「# 繰り返したい処理」にてその変数を利用可能です。それが要素分繰り返されます。
他の言語を習得された方は、いろんな違いがあることに気づかれたことでしょう。順に解説していきます。
カウンタを必要としない
例えば、C言語で処理を10回繰り返す処理は以下になります。
// C言語の繰り返しサンプル int i; for( i = 0 ; i < 10 ; i ++ ){ // 繰り返したい処理 }
上記C言語と比較して、Rubyのeachはカウンタ用の変数は不要、ということに気づかれたでしょうか?
eachが使える対象は広い
基本構文はオブジェクト.eachです。しかしオブジェクトとは具体的には何?という疑問がでてきましたか?
.eachの前の「オブジェクト」とは、配列やハッシュ(連想配列)、さらにRubyの特徴でもある範囲オブジェクトなどがきます。つまり、何が来ても.eachをつければよい、というのは使いやすいですね。
オブジェクト指向の考え方をすでにマスターした方は、eachが使える対象は?というよりも、扱うオブジェクトはeachメソッドを持つか?と考えたほうがよいでしょう。
[linkPotefuri word=フリーランス案件をお探しの方はこちら ]
配列にeachを使う
配列のすべての要素を処理してみましょう。
arrayという、要素を10個持つ配列を想定します。要素の中は以下とします。
array[0] = ‘zero’
array[1] = ‘one’
array[2] = ‘two’
array[3] = ‘three’
以下のコードを実行します。
# 配列にeachを使う array = ['one', 'two', 'three', 'four'] array.each do | value | puts value end
[実行結果]
zero one two three
arrayの中身がitemに入り、「puts item」でitemの中身が出力されました。
ところで、要素だけでなくインデックス(要素の順番を示す番号)も欲しいという場合はどうすればよいでしょうか?
Rubyでは、each_with_indexという便利なメソッドがあり、これを使うと簡単にインデックスを取得できます。
# 配列にeach_with_indexを使う array = ['one', 'two', 'three', 'four'] array.each_with_index do |item, index| puts index.to_s + ' ; ' + item end
[実行結果]
0 : zero 1 : one 2 : two 3 : three
itemで配列の中身、indexで番号を受け取ることができました。
[linkPoteCan word=3ヶ月間のRuby実践研修プログラムはこちら ]
ハッシュにeachを使う
配列は要素の順番をあらわすインデックスは数値です。ハッシュはインデックスを数値以外で設定できます。ハッシュの中身を以下とします。
hash[‘one’] = ‘value1’
hash[’two’] = ‘value2’
hash[’three’] = ‘value3’
上記hashをeachですべて処理しましょう。
# ハッシュにeachを使う hash = {'one'=>'1', 'two'=>'2', 'three'=>'3', 'four'=>'4'} hash.each do |item, index| puts index + ' ; ' + item end
[実行結果]
0 ; one 1 ; two 2 ; three 3 ; four
今度はindexとvalueという2つの変数で、ハッシュの中身を受け取っています。それをputsで出力しました。
範囲オブジェクト、timesメソッド
よりRubyらしいというか、Rubyの特徴的なものを紹介します。
範囲オブジェクト
繰り返し回数が決まっている場合は、範囲オブジェクトが使えます。以下は5回繰り返す例です。
# 範囲オブジェクトでeachを使う range = 0..5 range.each do |key| puts key end
[実行結果]
0 1 2 3 4 5
範囲オブジェクトは開始値..終了値と記述するだけで生成できます。さらにそれに.eachをつけると繰り返し処理が出来上がります。
Rubyには範囲オブジェクトというものがある、ということをお分かりいただけたでしょうか?
ここでは触れませんが、範囲オブジェクトは先頭や終了の要素を取得するなどなど、便利なメソッドがたくさんあります。興味のある方はコチラを見てみてください。
timesメソッド
本記事eachとは異なるものですが、繰り返しつながりでもう一つ、timesメソッドを紹介します。
繰り返し回数が決まっている場合は、timesメソッドも使えます。
# timesメソッドで繰り返す 3.times do puts '繰り返す処理' end
[実行結果]
繰り返す処理 繰り返す処理 繰り返す処理
回数指定で繰り返し処理を実装できました。
ここで重要なのは、Rubyで数値.timesで繰り返し処理ができる、ではなく「数値すらオブジェクト」ということです。ラッパークラス的なものを使わずに、数値オブジェクトのメソッドを簡単に呼び出せます。
例えば「10.to_s」とすれば文字列化できるし、「14.5.round」とすれば小数点以下を四捨五入できます。
[linkPoteCan word=Rubyへのスキルチェンジを目指すなら! ]
応用例:ファイルの一覧を取得する。
最後に、今まで解説してきたことを利用して、特定フォルダのファイルを一覧表示させてみます。
# ファイルの一覧を表示する dir = Dir.open('C:¥temp') dir.each do |f_name| puts f_name end
これだけでOKです。
Dirクラスのopenメソッドを使いファイルの一覧を取得し、それをeachで全要素を順番に表示しています。
まとめ
いかがでしたか?
eachによる繰り返し処理の実装と、その他プラスアルファのRubyの特徴をお分かりいただけたでしょうか?
本記事をスタートとして、Rubyに興味を持っていただければ幸いです。