Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyのmapメソッド完全ガイド!配列・ハッシュのデータ変換を実例で解説

Rubyのmapメソッドは、配列(Array)ハッシュ(Hash)範囲(Range)といったコレクションに対して使用できる強力なメソッドです。

mapの主な用途は、データの変換です。

例えば、文字列の配列があった場合、すべての文字列を順番に処理して、各文字を大文字に変換することができます。

また、Userオブジェクトのリストがある場合も同様です。

それらを変換して、対応するメールアドレスや電話番号など、Userクラスに定義された任意の属性のリストを作成できます。

それでは、具体的な使い方を見ていきましょう!

Ruby mapメソッドの基本構文

mapの構文は次のようになっています。

array = ["a", "b", "c"]

array.map { |string| string.upcase }

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

まず対象となる配列を用意します。ハッシュや範囲オブジェクトでも同じように扱えます。

次に、ブロックを付けてmapを呼び出します。

ブロックとは、波括弧 { ... } で囲まれた部分のことです。ブロックの中には、配列の各要素をどのように変換するかを記述します。イメージとしては関数に近いものです。

では、mapを呼び出すと何が起こるのでしょうか?

mapは変換結果を格納した新しい配列を返します

元の配列は変更されません。

もし元の配列自体を書き換えたい場合は、破壊的メソッドである map! を使用してください。

Ruby mapの実用例

ここで、実際の開発で役立つ例をいくつか紹介します。

数値を2倍にする

array = [1,2,3]

array.map { |n| n * 2 }
# [2, 4, 6]

文字列を整数に変換する

array = ["11", "21", "5"]

array.map { |str| str.to_i }
# [11, 21, 5]

ハッシュの値をシンボルに変換する

hash = { bacon: "protein", apple: "fruit" }

hash.map { |k,v| [k, v.to_sym] }.to_h
# {:bacon=>:protein, :apple=>:fruit}

このハッシュの例について少し補足します。

先ほどの例では、ブロック引数が2つになっていますね。これは、ハッシュの要素がキーと値のペアで構成されているためです。

そして、変換後のキーと値を組み合わせた新しい配列を返しています。

最後に to_h を呼び出して、この配列を再びハッシュへと変換しています。

Ruby mapとeachの違い

mapとeachには、どのような違いがあるのでしょうか?

eachは、mapのもっと原始的なバージョンのようなものです。

eachは各要素を取り出して処理することはできますが、その結果を収集しません。

eachは常に元のオブジェクトをそのまま返します

一方、mapはeachと同じように要素を一つずつ処理しますが、そのうえで…

変換後の要素からなる新しい配列を返します

array.each { |n| n * 2 }
# [1, 2, 3]

array.map { |n| n * 2 }
# [2, 4, 6]

Ruby mapとcollectの違い

実は、mapとcollectはまったく同じメソッドです。

同じ機能に対する別名にすぎません!

では、どちらを使うべきでしょうか?

オープンソースプロジェクトのコードを読んでみると、最もよく使われているのは map です。

迷ったらmapを選びましょう。

mapでインデックスを使う方法(with_index)

要素と一緒にインデックス番号も取得したい場合は、with_index メソッドを使います。

以下はその例です

array = %w(a b c)

array.map.with_index { |ch, idx| [ch, idx] }

# [["a", 0], ["b", 1], ["c", 2]]

おまけのヒント

with_index には引数を渡せるため、インデックスを0以外の数値から開始させることもできます。

mapの省略記法(map &)

引数を必要としないメソッドを呼び出す場合は、mapの省略記法を使うことができます。

["11", "21", "5"].map(&:to_i)

["orange", "apple", "banana"].map(&:class)

この & 構文は map に限ったものではなく、他のEnumerable系のメソッドでも利用できます。

mapメソッドのマインドマップ

Rubyのmapメソッド完全ガイド!配列・ハッシュのデータ変換を実例で解説

まとめ

この記事では、Rubyのmapメソッドとその使い方について学びました。あわせて、each、map、collectの違いについても理解を深めることができたはずです。

この記事が役に立ったと思ったら、ぜひRuby仲間にもシェアしてください🙂

ご覧いただきありがとうございました!

  1. Rubyのgrepメソッド徹底解説!使い方とselectとの違いを実例で学ぶ

    今回はRubyのgrepメソッドについて詳しく見ていきます。 このメソッドにはどんな便利さがあるのでしょうか? grepを使えば、配列(Array)や範囲(Range)など、Enumerableモジュールを含むオブジェクトから、条件に一致する要素だけを効率よく抽出できます。 「それってselectでも同じことができるのでは?」 確かにそうですが、grepはselectとは異なる仕組みで動作し、得られる結果も異なります。この違いを理解すれば、コードをより簡潔に書けるようになりますよ。 それでは、実際の例を見てみましょう。 Ruby grepメソッドの実例集 まず、次のような配列を用意します。

  2. Rubyの配列(Array)クラスの使い方徹底解説!基本操作と便利なメソッド一覧

    配列(Array)とは? 配列はRubyに組み込まれたクラスで、0個以上の要素をリスト形式で保持することができます。さらに、要素の追加・アクセス・繰り返し処理を簡単に行えるメソッドも多数用意されています。 もし配列が存在しなければ、値ごとに個別の変数を用意しなければならず、管理が非常に大変になります。 例: a = 1 b = 2 c = 3 しかし、配列を使えば次のように書けます: numbers = [1, 2, 3] さらに嬉しいことに、配列の中には何でも入れられます! 例えば: 数値 文字列 さらに別の配列!(これは多次元配列になります) それでは、配列を最大限に活用できる