【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メソッドの使い方と、類似メソッドとの違いを覚えておいてください。

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

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

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

この記事を書いた人

学生時代を含めると、かれこれ10年以上プログラマーとして過ごしています。
様々な言語や環境、プロジェクトに関わってきましたので、より実践的な記事をみなさんにお届きるよう情報発信していきます!

目次