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

Rubyのselectメソッドの使い方を実例つきで徹底解説

Rubyのselectメソッドを使うと、オブジェクトの配列を簡単にフィルタリングできます。

たとえば、リストの中から偶数をすべて見つけたい場合などに便利です。

selectを使わずに書くと、次のようになります:

even_numbers = []

[1,2,3,4,5,6].each do |n|
  if n.even?
    even_numbers << n
  end
end

even_numbers

こんなにシンプルな処理なのに、かなり長いコードになってしまいますね!

それでは、selectの使い方を学んでいきましょう。

selectメソッドの基本例

selectを使うには、ブロックが必要です。

ブロック内ではtrueまたはfalseと評価される値を返す必要があり、selectはその結果をもとに配列をフィルタリングします。

Rubyにおける真偽値については、こちらの記事で詳しく学べます。

以下が例です

[1,2,3,4,5,6].select { |n| n.even? }

これは冒頭の最初の例とまったく同じ動作をしますが、コード量はぐっと少なくなります。

実は、さらに短く書くことも可能です。

次のように

[1,2,3,4,5,6].select(&:even?)

このようなショートカット(&:記法)は、配列の各要素に対して直接メソッドを呼び出す場合にのみ使えます。

ちなみに、selectはハッシュにも使えます。

stock = {
  apples: 10,
  oranges: 5,
  bananas: 1
}

stock.select { |k, v| v > 1 }

# {:apples=>10, :oranges=>5}

ここでkはキー、vは値を表しています。

つまりこういう意味です

「在庫が1より多い果物をすべて探して」。

selectと他のメソッドの組み合わせ

selectメソッドは、他のEnumerableメソッドと組み合わせることができます。

特によく使われるのがwith_indexです。

fruits = %w(apple orange banana)

fruits.select.with_index { |word, idx| idx.even? }

# ["apple", "banana"]

これにより、オブジェクト(この場合は文字列)そのものではなく、インデックスを使ってフィルタリングできるようになります。

配列をその場でフィルタリングする(select!)

配列に対してselectを使うと、常に新しい配列が作られます。

元の配列自体を変更したい場合は、select!メソッドを使いましょう。

やり方はこちら

fruits = %w(apple orange banana)

fruits.select! { |fruit| fruit.start_with? "a" }

# ["apple"]

感嘆符(!)で終わるメソッド(select!など)は、新しいオブジェクトを返す代わりに元のオブジェクトを変更します。ただし、これは言語によって強制されるルールではなく、Rubyプログラマーの間での慣習にすぎません。

findとselectの違い

selectは、リストをフィルタリングして結果を配列として受け取りたい場合に最適です。

では、オブジェクトを1つだけ見つけたい場合はどうでしょうか?

そのようなときにはfindメソッドを使います。

次のように

letters = %w(a aa aaa aaaa)

letters.find { |l| l.size == 3 }
# "aaa"

letters.find { |l| l.size == 10 }
# nil

findは最初にマッチした要素を返し、見つからなければnilを返します。

find_allメソッドとは?

find_allメソッドについて、findselectとの関係が気になっている方もいるかもしれません。

実はとてもシンプルです!

  • find_allメソッドはselectのエイリアス(別名)です。
  • findメソッドは、複数ではなく特定の1つのオブジェクトを探すためのものです。

さらに、Ruby 2.6ではselectのもうひとつのエイリアスとして次が追加されました:

filter

selectの逆のことをしたいときは?

欲しい要素を選ぶ代わりに、不要な要素を取り除きたいというケースもありますよね。

selectでも簡単に書けます

[1,2,3,4,5,6].select { |n| n != 4 }

しかし、意図をより明確に表せるメソッドがあります。

それがrejectです。

[1,2,3,4,5,6].reject { |n| n == 4 }

パフォーマンスなどの面で技術的なメリットがあるわけではありませんが、コードの可読性と意図の明確さが大きく向上します。

Railsのselectメソッドには注意

Railsのモデルを扱っていると、そこでもselectが使えることに気づいて混乱するかもしれません。

知っておくべきなのは…

このselectメソッドは別物だということです!

Fruit.select(:id, :name, :color)

ActiveRecordモデルに対してselectを使うと、データベースから取得する特定のカラムを指定することになります。

これは主にパフォーマンス上の理由によるものです。

最後にひとつ補足

Railsアプリ内でも、通常の配列に対してselectを使う場合は、この記事で説明してきたselectメソッドが使われます。

まとめ

今回は、配列・範囲(Range)・ハッシュといったオブジェクトのコレクションを扱う際に最も役立つRubyメソッドのひとつであるselectについて学びました。

Rubyのselectメソッドの使い方を実例つきで徹底解説

さあ、今度はあなたがエディタを開いて、実際に使ってみる番です。

最後まで読んでいただきありがとうございました!


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

    Rubyのmapメソッドは、配列(Array)・ハッシュ(Hash)・範囲(Range)といったコレクションに対して使用できる強力なメソッドです。 mapの主な用途は、データの変換です。 例えば、文字列の配列があった場合、すべての文字列を順番に処理して、各文字を大文字に変換することができます。 また、Userオブジェクトのリストがある場合も同様です。 それらを変換して、対応するメールアドレスや電話番号など、Userクラスに定義された任意の属性のリストを作成できます。 それでは、具体的な使い方を見ていきましょう! Ruby mapメソッドの基本構文 mapの構文は次のようになっています。 a

  2. Linuxのwatchコマンドの使い方と実用例をわかりやすく解説

    Linuxのwatchコマンドは、指定したコマンドを一定間隔で繰り返し実行し、その結果を画面に表示し続けるためのツールです。コマンドの出力が時間とともにどう変化するかをリアルタイムで監視したい場合に非常に便利です。この記事では、watchコマンドの基本的な使い方と、覚えておくと役立つ実用的な例を紹介します。 watchコマンドの基本構文 watchコマンドの構文は以下のとおりです。 watch オプション コマンド 各要素の意味は次のとおりです。 オプション: 後述の表から選択したオプションを指定します。watchコマンドのデフォルト動作を変更できます。 コマンド: watchが繰り返し実行