みなさんこんにちは!
フリーランスプログラマーのsatoです。
今回は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点には注意が必要です。
・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メソッドの使い方と、類似メソッドとの違いを覚えておいてください。
プログラムの規模が大きくなればなるほど、扱うデータ量は増え、配列へアクセスする頻度は向上していくものです。
その時、的確なメソッドを使用できることは、とても重要な能力です。
いろいろなメソッドを学び、より良い配列操作ができるようになっておきましょう!