【Rubyの基本】「each」「map」の使い分け

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

ChatGPTによる解説(備忘録)

eachmap はどちらもRubyのイテレーションメソッドですが、使用目的や結果に違いがあります。それぞれの使い方と違いについて説明します。


each メソッド

each メソッドは、ブロック内の処理を配列の各要素に対して順に実行します。each は、配列やハッシュの各要素を処理するために使われますが、元のデータ構造に対して何も変更を加えずにそのまま返します。

主な用途:

  • 要素を一つずつ処理するが、配列やハッシュ自体を変換しない場合。
[1, 2, 3].each do |num|
  puts num * 2
end

# 出力
2
4
6

この例では、各要素を2倍して表示するだけで、元の配列は変更されません。


map メソッド

map メソッドは、ブロック内の処理を配列の各要素に対して順に実行し、その結果を新しい配列にして返します。元の配列は変更されません。

主な用途:

  • 配列の各要素を変換して、新しい配列を作成する場合。
doubled = [1, 2, 3].map do |num|
  num * 2
end
puts doubled

# 出力
[2, 4, 6]

この例では、各要素を2倍にした新しい配列が作成されます。


使い分けの理由

eachmap を使い分ける理由は、主に次の通りです:

  1. 結果を必要とするかどうか:
    • 結果を新しい配列として取得したい場合は map を使います。
    • 結果を必要とせず、副作用(例えば、画面への出力や変数の更新)だけを目的とする場合は each を使います。
  2. 意図の明確化:
    • map を使うことで、「このブロックは変換を目的としている」という意図が明確になります。
    • each を使うことで、「このブロックは要素ごとの処理を目的としている」という意図が明確になります。

コードの具体例で説明

●●の Qiita クラスの例では、eachmap を以下のように使い分けています。

Qiita
  attr_accessor :query

  def initialize(query)
    @query = query
  end

  def search
    # Qiitaの投稿情報を取得するAPIのURLを生成
    url = "https://qiita.com/api/v2/items?query=#{@query}"
    # URIクラスを使用してURLを解析
    uri = URI.parse(url)
    # URLにアクセスしてレスポンスを取得
    res = Net::HTTP.get(uri)
    # 文字列から配列にパースする
    res = JSON.parse(res)
    # 記事のタイトルと投稿者名を配列に格納する
    articles = res.map do |item|
      "#{item['title']} by #{item['user']['name']}"
    end
    articles
  end
end

このコードでは、map を使って API から取得した記事情報を変換し、新しい配列 articles に格納しています。もし単に各記事を表示するだけなら、each を使うこともできますが、今回は変換結果を新しい配列として取得することが目的なので map が適切です。


qiita = Qiita.new('Ruby')
articles = qiita.search
puts articles

この部分では、search メソッドから返された新しい配列 articles を表示しています。


#DAY30