【Ruby eachの応用編】さまざまな使い方を網羅的に理解しよう

Rubyのeachメソッドで配列やハッシュの処理を行いたい
配列やハッシュの要素を順番に処理する方法が知りたい
eachメソッドってよく見かけるけどどうやって使うの?

eachメソッドを使用すれば配列やハッシュの要素を順番に取り出すことができます。また、関連したメソッドを使用すれば、さまざまな処理を行うことができます。

たとえば、配列の要素ごとに順番にブロックで処理を行ったり、処理を分岐させるといったことも可能になります。つまり、eachメソッドを使い方こなせば、配列やハッシュから自由に値を取り出すことができるのです。

実際のプログラムでもeachを使った処理は使用頻度が高いので、しっかりマスターするようにしましょう。

この記事では、配列のeachの使い方について以下の内容で解説していきます。

  • eachとは?
  • 配列でのeachメソッドの扱い方
  • ハッシュでのeachメソッドの使い方

Rubyのeachとは

eachとは、配列においてもっとも基本的なメソッドです。

eachメソッドを使うことによって、配列に含まれる要素を順番にプロックに渡して、簡単に任意の処理をすることができます。

eachメソッドの基礎については、以下の記事で詳しく解説しています。

さまざまなeachメソッド

eachは先述したように配列の値を要素ごとに取り出すことができます。

では実際にeachを使ってみましょう。

サンプルコード:

サンプルコードの実行結果:

eachは「配列.each{|変数|〜}」で指定した変数に配列の要素を1つずつ取り出して処理を実行します。このように、配列の要素である10,20,30が順番にブロックに渡されていることがわかります.

each_with_index(インデックス番号を扱う)

さきほど、説明したeachメソッドだけではインデックス番号をブロックの中で扱うことができません。もし、インデックス番号もブロックで扱いたいときはeach_with_indexという便利なメソッドが用意されています。

サンプルコード:

サンプルコードの実行結果:

一番初めのaには、配列の要素が代入され、二番目のiにはインデックス番号が代入されています。ですが、お気づきの通りこのままでは、一番初めの要素の場合、インデックス番号が「0」なので0番目の要素になってしまいます。

そのため、1番目の要素と表示したい場合は下記のメソッドを使用します。

each.with_index(初期値を設定して、インデックス番号を扱う)

each.with_indexメソッドでは、始めに初期値をインデック番号に設定することができます。each_with_indexでは0番目の要素表示されてしまった部分を修正することができます。

サンプルコード:

サンプルコードの実行結果:

(1)のように、カッコ内に任意の数値を初期値として設定することができます。each_with_indexメソッドとeach.with_indexメソッドは「_」と「.」が違うだけなので、覚えやすく、使い勝手もいいのでまとめて覚えてしまうことをおすすめします。

each_slice(配列の要素を指定した数値で切り分ける)

each_sliceメソッドを使えば、配列の要素を指定した数値にしたがって分割することができます。

サンプルコード:

サンプルコードの実行結果:

このように、2つずつに分割したいときは2を指定して、3つずつに分割したいときは3を指定します。とても直感的ですね。

each_line(改行ごとに切り分ける)

each_lineメソッドは指定した文字列の中から改行コードで分割して1行ずつ取得する場合に使用します。

サンプルコード:

サンプルコードの実行結果:

このように改行コードごとに文字列が分割されていることがわかりますね!

ハッシュでのeach

ハッシュの扱い方

ハッシュとは、keyとvalueのペアを使うことで、複数オブジェクトへの参照を管理することが出来るオブジェクトです。keyは配列でのインデックス(各要素に振り分けられた番号)に相当します。

ハッシュの場合は、インデックスとは違い、keyとしてオブジェクトを指定し、たとえば下記のように、

と指定することで、値を取得できます。ハッシュのkeyには、任意のオブジェクトを指定できます。

keys(ハッシュのkeyを配列で取得する)

ここではハッシュからkeyを取得してみましょう。

ハッシュの各要素(keyとvalueのペア)から、keysメソッドで、keyのみを配列として取り出すことが可能です。keyを配列として取り出しても、ハッシュ自体は何の影響も受けません。

取り出したkeyは、単なる配列ですので、自由に編集・操作可能です。

サンプルコード:

サンプルコードの実行結果:

以上のように、keyを配列で取得できました。

values(ハッシュのvalueを配列で取得する)

同様にvalueも取り出すことができます。

サンプルコード:

サンプルコードの実行結果:

以上のように、valueを配列で取得できました。

foreachのようなeach (ブロックにハッシュのキーと値を繰り返し渡す)

サンプルコードの実行結果:

このように、keyとvalueを同時に取り出すこともできます。厳密にはforeachはrubyにはありませんが、rubyで表現しようとするとこのようになります。

each_key(ブロックにハッシュのキーだけ繰り返し渡す)

配列のeachメソッドのように、ハッシュもeach_keyメソッドでループできます。配列とeachメソッド同じようにeach_keyもブロック付きメソッドですので、通常、ブロックを引数に与えます。

そのブロックのブロック引数でハッシュのkeyを取得できます。

サンプルコード:

サンプルコードの実行結果:

以上のように、each_keyにより、ハッシュをkeyでループできました。ブロック内では、ブロック変数としてkeyを取得できました。

each_value(ブロックにハッシュの値だけ繰り返し渡す)

同様に、valueも取り出せます。

サンプルコード:

サンプルコードの実行結果:

each_with_object (ブロックに値を渡して新たな配列を作成)

サンプルコード:

サンプルコードの実行結果:

この場合は、valueが4以上のペアのkeyを出力してします。このように、each_with_objectを使えば条件を指定してハッシュから新たな配列を作成できます。

sort (ハッシュをkeyでソートする)

ハッシュが下記のような順番であったとしましょう。

ハッシュhのkeyはアルファベット順に並んでいません。このままeach_keyでループしてしまうと、

  1. def
  2. ghi
  3. abc

の順番でループしてしまいます。

それでは困る際に、ハッシュをkeyでソートすることができます。なおRubu1.9以上からは、ハッシュのソート結果はハッシュではなく、Enumerableになります。

サンプルコード:

サンプルコードの実行結果:

以上のように、sortメソッドを使用するとメソッドの戻値が、keyでソートされたEnumerableになります。Enumerableとは、配列と同等の動作をするモジュールのことです。
通常は配列と思っていただいてかまいません。

sortメソッドの戻値のEnumerableは、ハッシュの各要素を、配列[ key, value ] という要素として持っている配列です。また、sortメソッドを適用したレシーバのハッシュh自体はソートされないことも確認できました。

has_key (ハッシュにkeyが存在するか確かめる)

ハッシュから値を取り出すには、keyを指定する必要があります。しかし、ハッシュ内に存在しないkeyを指定すると、nil値が返ってきます。

そのため、事前にkeyが存在するかどうかを確認するhas_key?メソッドがあります。このメソッドにより、事前にkeyが存在するかどうかをチェックし、keyが存在する場合と、keyが存在しない場合で処理を分けることができます。

サンプルコード:

サンプルコードの実行結果:

以上のように、has_key?メソッドにkeyの候補を引数として与えることにより、レシーバのハッシュがkeyの候補を持っているかどうかをチェックできました。

has_value (ハッシュにvalueが存在するか確かめる)

同様に、valueの存在も確かめることができます。

サンプルコード:

サンプルコードの実行結果:

まとめ

この記事では、配列やハッシュにおけるeachの使い方を解説しました。

  • eachとは?
  • 配列でのeachメソッドの扱い方
  • ハッシュでのeachメソッドの使い方

eachメソッドは、その派生メソッド含めて使用の頻度が高いので、早いうちに身につけておくべきです。たくさんメソットがあるように見えますが、基本的には配列や、ハッシュの要素を順番にブロックに渡してなにかしらの処理を加えているだけです。

一度にたくさんのメソッドを覚えるのは大変なので、忘れてしまったらまたこの記事を読み返してみてください。

Rubyカリキュラム無料公開中!

この記事はRuby入門完全攻略ガイド【基礎学習/アプリ開発/仕事獲得】の一部になります。このカリキュラムは、プログラミング入門者が、基礎学習からアプリ開発、さらには仕事獲得まで体系的に学べる内容となっています。

Ruby学習に必要な情報を一つにまとめていますので効率よくRubyを学ぶことが出来ます。この機会に是非活用していただければと思います。

【Ruby入門ガイド】アプリ開発で知っておくべき知識を総ざらい
更新日 : 2018年11月23日

Rubyを最短で習得したい方へ

近年では様々なWEBサービスが流通するようになりました。

WEBサービスの普及が進むにつれて、それらを素早く開発するのに長けたRubyの人気は今後さらに増し、Rubyエンジニアの需要も自ずと増えることは間違いなしでしょう。

元々ITリテラシーの高い方や他言語を習得している方であれば、独学でRubyを習得することが可能です。

ただし、プログラミング学習をしている方の多くは

「自分に合った教材が見つけられずに挫折してしまった」
「勉強のための勉強になってしまい、ゴールが見えない」
「情報が少なくどう調べればいいかわからない」
「エラーを解決するのに何日もかかってしまう」

このような悩みを抱えたまま挫折してしまうのが現実となっています。

  • もう挫折したくない
  • 本業と両立しながら、好きな時間で自分のペースで勉強を続けていきたい
  • 自分だけのカリキュラムで効率的に勉強したい
  • WEBアプリケーション開発までしっかりサポートして欲しい
そんな方はお気軽に侍エンジニア塾までご相談ください。

お一人お一人に専属のインストラクターがつくので、初心者の方がつまづきがちな、「CookPad」、「Wantedly」、「食べログ」のようなWEBアプリケーション開発方法もスムーズに学習することできます。

実際にオリジナルWEBアプリを開発し、成果物として認められて仕事獲得に成功した塾生は数多くいます。

このように、オリジナルアプリ開発から仕事獲得まで徹底的にサポートすることでプログラミング初心者の方でも安心して基礎学習に取り組むことができます。

まずは『無料体験レッスン』で、弊社のコンサルタントと一緒にあなた専用の学習方法やカリキュラムを考えてみませんか?

Rubyならではの学習方法や、現役フリーランスRubyエンジニアから貴重なアドバイスを受けることができます。

詳しくは下の画像から弊社サービス内容をご確認ください。

ruby_a2
LINEで送る
Pocket

書いた人

長瀬来

長瀬来

Unityを使ったiOSアプリのリリース、フリマサイト運営の経験があります。

経験した言語はC、C#、Javascript、R、Python、Ruby、PHPなど

言語が好きで、英語や中国、ドイツ語を勉強しました。
将来的には海外で生活したいです。

現在はRuby on Rails5やCocos2dxの勉強を主にしています。

ライターとしては
できるだけ初心者にわかりやすい文章になるように心がけています。

趣味は語学、読書です。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説