【Rails入門】mapメソッドを完全攻略!配列操作の基礎を学ぼう

みなさんこんにちは!

フリーランスプログラマーのsatoです。

今回はmapメソッドを見ていきましょう。

みなさん配列を使用するとき、どうやって要素へアクセスしていますか?

その一つの手段としてmapメソッドがあるのですが、今回はその具体的な使い方を見ていきましょう。

使い方がわからない人はもちろん、既に使っている人も、類似メソッドとの違いなどを知り理解を深めておきましょう。

それでは今回のアジェンダです。

[基本] mapメソッドとは?
[基本] mapメソッドを使ってみよう!
[基本] map!メソッドも使ってみよう!
[応用] hashでも使用できる!
[応用] 類似メソッドとの違いは?
[応用] もっと配列操作メソッドを知ろう!

まずは基本的な使い方を知り、そのあとで類似メソッドについて見てきましょう。

それではよろしくお願いいたします。

目次

mapメソッドとは?

mapメソッドを一言で表すと「各要素へ順に処理を実行してくれるメソッド」です。

要素それぞれにアクセスし、指示した処理を行ってくれるわけですね!

と言っても、言葉よりも実際見たほうがわかりやすいので、このあと具体的に見ていきましょう。

mapメソッドを使ってみよう!

それでは実際に使ってみましょう。

各要素で処理を行ってみよう!

以下の処理は、arrayに入っている文字をすべてログに出力している処理です。

array = ["a", "b", "c"]                          # 配列
array.map {|item|  logger.debug(item) }  # 各要素をログ出力

これだけで、各要素を個別にログに表示できているわけです。

具体的に処理を見てみよう!

それでは処理を具体的に見ていきましょう。

mapメソッドの使い方は以下の通りです。

配列変数.map {|変数名| 具体的な処理 }

先ほどの処理と照らし合わせて確認してみましょう。

array.map {|item|  logger.debug(item) }  # 各要素をログ出力

mapメソッドで、array変数の各要素をitemという変数で取り出し、debugメソッドでログに出力しているわけですね。

※今回はitemという変数名にしていますが、この変数名は別の名前でも問題ありません。

戻り値を使用してみよう!

mapメソッドには戻り値も存在します。

例えば以下は、配列内の文字を大文字に変える処理ですが…

・処理

array = ["a", "b", "c"]                   # 配列
array.map {|item|  item.upcase }  # 各要素を大文字にする

・実行後のarrayの中身

["a", "b", "c"]

大文字になっていませんね…

upcaseメソッドが文字列を大文字に変えるメソッドです。

それもそのはずで、itemとして取り出した変数の値を変更しても、array自体の要素に変更をかけることができないのです。

その一つの解決方法として戻り値が存在します。

・処理

array = ["a", "b", "c"]                   # 配列
array = array.map {|item|  item.upcase }  # 各要素を大文字にする

・実行後のarrayの中身

["A", "B", "C"]

戻り値には各要素の変更後の値が入った配列が返ってきます。

こうして戻り値でarray変数を上書きすれば、更新後のものに変更できますね!

map!メソッドも使ってみよう!

また「map!メソッド」も存在します。

rubyでは基本的に「!」が後ろにつくメソッドは「破壊的メソッド」と呼ばれています。

破壊的というと少し怖いイメージも湧いてきますが、物騒な物ではなく、とても便利な仕組みなんです。

簡単なので実際に使ってみましょう。

先ほどの文字を大文字にする処理を、map!メソッドで書き直しました。

・処理

array = ["a", "b", "c"]            # 配列
array.map! {|item|  item.upcase }  # 各要素を大文字にする

・実行後のarrayの中身

["A", "B", "C"]

戻り値を使用せずとも、item変数への変更が、arrayメソッドに反映されていますね!

これがmap!メソッドの特徴です。

取得した要素を変更するときに、array自体にも更新がかかることを「破壊的」と言っているわけです。

たしかにarray自体の要素を上書き(破壊)していますからね!

hashでも使用できる!

ここまでは配列で試していましたが、ハッシュの場合はどうでしょう。

実はちゃんと使用ができます!

hash = {ruby:"rails",php:"cakePHP",java:"Spring"}
array = hash.map {|k,v| v.upcase }

こんな風に、キーと要素の変数を与えてあげれば、キーにも要素にもアクセスできるわけですね!

しかし以下の2点には注意が必要です。

・戻り値はaray
・map!メソッドはハッシュに対しては使用でないので注意しましょう。

どうしてもhash型で取得し直したい場合は以下のように一工夫が必要です。

hash = {ruby:"rails",php:"cakePHP",java:"Spring"}
hash = hash.map {|k,v| [k, v.upcase] }.to_h

.to_hメソッドを使用して、hashとして作りおなすといった手段が有効でしょう。

類似メソッドとの違いは?

配列操作を行うメソッドはmapメソッド意外にもたくさんあります。

ここでは他の配列操作メソッドをmapメソッドと比較しながら見ていきましょう。

selectとの違い

selectメソッドは、mapと違い「条件に合う要素を取得」してくれます。

・処理

array = [1, 2, 3, 4, 5, 6, 7, 8]
array = array.select {|item| item <= 3 }

・実行後のarrayの中身

[1, 2, 3]

今回だと3以下の要素のみ取得しているわけです。

簡単ですね!

collectとの違い

実はcollectメソッドはmapメソッドと同一のメソッドです。

以下のようにmapメソッドと同様に使用が可能です。

array = ["a", "b", "c"]                   # 配列
array = array.collect {|item|  item.upcase }  # 各要素を大文字にする

というのも、じつはmapメソッドのリファレンスにも明確に「collectメソッドの別名です。」と記載されているのです。

名前が違うだけなんですね。

eachとの違い

違いを一言で言ってしまうと「戻り値」が違います。

mapの戻り値は、要素に変更をかけた場合変更されたものが返ってきていましたね。

しかしeachは違います。

変更されていないものが返ってきます。

・処理

array = ["a", "b", "c"]                    # 配列
array = array.each {|item|  item.upcase }  # 各要素を大文字にする

・実行後のarrayの中身

["a", "b", "c"]

確かにmapと違い、変更が変わっていませんね!

つまり要素に変更がかからない場合はeachと使用する。

要素に変更がかかる場合はmapを使用する。

と言った使い分け方ができるでしょう。

もっと配列操作メソッドを知ろう!

今回はmapを中心に、配列操作を見てきました。

しかし実は、まだまだいろいろな種類の配列操作方法が存在します。

まとめ

今回は要素へのアクセス手段として、mapメソッドを学んできました。

ぜひmapメソッドの使い方と、類似メソッドとの違いを覚えておいてください。

プログラムの規模が大きくなればなるほど、扱うデータ量は増え、配列へアクセスする頻度は向上していくものです。

その時、的確なメソッドを使用できることは、とても重要な能力です。

いろいろなメソッドを学び、より良い配列操作ができるようになっておきましょう!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次