※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。
ChatGPTによる解説(備忘録)
each
とmap
はどちらも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倍にした新しい配列が作成されます。
使い分けの理由
each
と map
を使い分ける理由は、主に次の通りです:
- 結果を必要とするかどうか:
- 結果を新しい配列として取得したい場合は
map
を使います。 - 結果を必要とせず、副作用(例えば、画面への出力や変数の更新)だけを目的とする場合は
each
を使います。
- 結果を新しい配列として取得したい場合は
- 意図の明確化:
map
を使うことで、「このブロックは変換を目的としている」という意図が明確になります。each
を使うことで、「このブロックは要素ごとの処理を目的としている」という意図が明確になります。
●●の Qiita
クラスの例では、each
と map
を以下のように使い分けています。
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