1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby】each_indexメソッドとselectメソッドの性質の違い

Last updated at Posted at 2024-11-12

はじめに

こんにちは!アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
現在Arrayクラスを勉強中ですが、その中でもeach_indexメソッドとselectメソッドの意外な違いを発見したので記事にしようと思いました

each_indexメソッドとは

まず、each_indexメソッドについて簡単に説明します。
each_indexは、配列の各インデックスを順に処理するためのメソッドです。
通常、配列のインデックスに基づいた操作を行う際に便利ですが、重要な点は、新しい配列を作成する機能を持たないということです。

a = [10, 20, 30, 40, 50]
a.each_index do |index|
  puts "インデックス: #{index}, 値: #{a[index]}"
end

このコードでは、各インデックスを順に取得し、対応する要素を出力しています。
しかし、この操作は元の配列を参照するだけで、新しい配列を作成する機能はありません。
そのため、もし特定の条件に基づいて要素を抽出し、新しい配列に格納したい場合は、空の配列を初期化して自分で要素を追加する処理を記述する必要があります。

(補足)each_with_indexのほうがこの場合はわかりやすい

コメントいただいたので補足として加えておきます。上記のように要素とインデックスを使用する場合はeach_with_indexを使用した方がわかりやすいです

a = [10, 20, 30, 40, 50]
a.each_with_index do |value, index|
  puts "インデックス: #{index}, 値: #{value}"
end

each_indexを用いて特定の条件に一致する要素を集める場合は以下のように書く必要があります

a = Array.new(100) { |i| i + 1 }
a3 = [] # 新しい配列を初期化

a.each_index do |index|
  if a[index] % 3 == 0
    a3 << a[index] # 条件を満たす要素を新しい配列に追加
  end
end

p a3

この例では、3の倍数を抽出して新しい配列a3に格納しています。
each_indexは新しい配列を作成する機能を持たないので、上記のように、新しい配列を作成する際は自分で初期化する必要があります。

(補足)上記の場合はeachのほうがシンプルでわかりやすい

上記のコードをeach_indexで書いてしまいましたが、eachのほうがこの場合はシンプルで保守性も考えたら適切かなと思いました

a = Array.new(100) { |i| i + 1 }
a3 = [] # 新しい配列を初期化

a.each do |x| 
  if x % 3 == 0 
    a3 <<x # 条件を満たす要素を新しい配列に追加 
  end
end

p a3

selectメソッド

次に、selectメソッドについて見ていきましょう。
selectは、配列の各要素を順に評価し、条件を満たす要素を新しい配列にまとめて返すイテレータメソッドです。
selectは内部で新しい配列を自動で作成し、条件に一致する要素を格納して返してくれるため、新しい配列の初期化が不要です。
selectを用いて特定の条件に一致する要素を抽出すると以下のようになります

a = Array.new(100) { |i| i + 1 }
a3 = a.select { |i| i % 3 == 0 }
p a3

このコードでは、selectメソッドが自動で3の倍数を集めて新しい配列を生成し、a3に代入しています。
selectを使用することで、簡潔に記述でき、余分な初期化や要素の追加処理が不要になります。

each_indexselectの違いをまとめると

目的の違い

each_indexは配列のインデックスに基づいた処理を行うためのメソッドであり、元の配列を操作する用途に向いています。
新しい配列を作成する機能は持たないため、別途配列を初期化する必要があります。
selectは、特定の条件に一致する要素を集めて新しい配列を返すことが主な役割です。そのため、新しい配列を自動で作成して返す仕様になっています。

実装の違い

each_indexでは、要素を集めたい場合、自分で新しい配列を初期化し、<<で要素を追加する手間が必要です。
selectでは、条件に一致する要素を自動的に新しい配列に格納して返してくれるため、初期化不要で簡潔な記述が可能です。

まとめ

each_indexselectは、用途や性質が異なるメソッドですが、それぞれ適した場面で使用することで効率的な配列操作が可能です。
特に、新しい配列を作成する際の初期化の有無について理解することで、コードの記述がスムーズになります。
事前に知っておくことで、余計なコードを書く手間が減り効率のよいコードを書くことができるようになります。

1
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?