Rubyのselectメソッドを使うことで、配列の要素の中から条件を満たす要素を抜き出す処理を簡潔に記述できます。もし繰り返し処理の中で配列の要素をチェックする書き方をやっているようでしたら、ぜひselectメソッドの使い方を知ってください。
今回は便利なメソッドが揃っている配列クラスのメソッドの中でも、いろいろな応用ができるselectメソッドについて解説します。
selectメソッドとは
Rubyには配列やハッシュの要素をまとめて処理できる便利なメソッドが幾つもあります。そして、配列またはハッシュの要素をチェックし、ある条件を満たす要素を抜き出して配列として返すselectメソッドです。
次からselectメソッドの概要について紹介します。
配列というオブジェクトの特徴
C言語の影響を受けた多くのプログラム言語で配列が利用できますが、それらは添え字が付いている連続した変数というケースがほとんどです。そして配列を操作するためには連続した変数全てを対象とするために繰り返し処理を使われます。
しかしRubyでは配列をオブジェクトとして扱います。オブジェクトなので必ずしも繰り返し処理で操作する必要はありません。配列クラスに定義されたメソッドを使えば簡単な記述で欲しいデータを取り出せます。
今回紹介するselectメソッドもそんな配列クラスのメソッドの1つです。
selectメソッドの機能
selectメソッドは、配列またはハッシュに格納された各要素を評価し、ある条件に該当する要素のみ抽出して新しい配列にして返すメソッドです。
具体的にはselectメソッドに続いてブロックの中に要素を評価する処理を記述します。同じような機能を配列やハッシュのeachメソッドによる繰り返し処理でも作れますが、より簡潔に記述することが可能です。ぜひselectメソッドの使い方をマスターしてください。
selectメソッドは配列とハッシュで使える
Rubyではプログラム内で使用する変数や関数は全て何らかのクラスに属しており、クラスが違えば使えるメソッドも全く別です。
今回紹介するselectメソッドは配列とハッシュで利用できるメソッドですが、配列で使えるselectメソッドとハッシュで使えるselectメソッドとは使い方が違います。さらに各要素が数字や文字列などの場合、評価する際に使えるメソッドはそれぞれの要素が所属するクラスに依存します。
selectを使う場合は、配列やハッシュ、各要素のそれぞれが属するクラスに注意して使用してください。
配列クラスのselectメソッドの使い方
今回紹介するselectメソッドは配列クラスとハッシュクラスの変数を対象に使用できます。この2つの中から、まずは配列クラスのselectメソッドの使い方について紹介します。
配列クラスのselectメソッドの文法
selectメソッドは配列の各要素に対してブロックの中に評価する仕組みを作り、その評価結果でtrueになった要素だけの配列を返します。
配列クラスのselectメソッドの文法
配列.select do |ブロック内の変数| 条件 end
配列.select { |ブロック内の変数| 条件 }
ブロックの中の条件式の書き方
Rubyはプログラムに記述する変数やメソッドは何かのクラスに属しています。seletメソッドのブロックで変数を評価する場合、それぞれのクラスに合わせてメソッドを使用してください。
またselectで使用するブロックでは、評価した結果がtrueかfalseになるように記述します。
selectメソッドで配列の要素が数字の場合の例
arr = [1, 2, 3, 4, 5] out = arr.select { |x| x == 2 } p out # [2]を表示する
この例では配列arrに含まれる数字に対して、selectメソッドのブロックで「x == 2」の条件でtrueになった数字、つまり2のみの配列を作って返し、それを表示しています。
文字列の条件に正規表現も使える
先ほど配列に含まれる数字を評価する例を紹介しましたが、要素が文字列の場合は文字列を評価するメソッドを使用します。さらに、Rubyの正規表現で文字列を評価することも可能です。
selectメソッドで正規表現を使って評価した例
arr = ['one', 'two', 'three', 'four', 'five'] out = arr.select { |x| /f./ =~ x } p out # ["four", "five"]を表示する
この例では配列arrの要素をブロック内の変数xで受けて、正規表現「/f./ =~ x」で評価しています。なおこの正規表現は、「f」と「.」でfで始まる文字列の場合trueを返す、というパターンを表しています。そのためselectメソッドは「four」と「five」の2つの要素の配列を返します。
Hashクラスのselectメソッドの使い方
先ほど配列に対するselectメソッドの使い方を紹介しましたが、selectメソッドはハッシュでも利用できます。次からハッシュに対するselectメソッドの使い方を紹介します。
ハッシュクラスのselectメソッドの文法
Rubyにおけるハッシュとは、キーと値のペアで複数の値を管理するためのオブジェクトで、キーで値を参照することから連想配列とも呼ばれます。ハッシュから条件に合う値を抽出するには、キーで検索する方法と値で選択する方法、およびその両方で検索する方法から選択可能です。
ハッシュクラスのselectメソッドの文法
ハッシュ.select do |キーにあたる変数, 値にあたる変数| 条件 end
ハッシュ.select { |キーにあたる変数, 値にあたる変数| 条件 }
ハッシュクラスのselectメソッドの例
先ほど紹介したようにハッシュクラスのselectでブロック内に記述する条件にキーと値の2つの変数が使えるのでうまく使い分けてください。なお条件の書き方は、配列のselectと同じでキーや値が数字か文字列かによって、条件に使える演算子やメソッドが変わるので注意が必要です。
ハッシュのselectメソッドの例
hash = { "cha1" => "A", "num1 => "1", "cha2" => "b", "num2" => "1" } out1 = hash.select do |key, val| key.include?("1") end p out1 # {"cha1"=>"A", "num1"=>"1"}が表示される out2 = hash.select do |key, val| val == "1" end p out2 # {"num1"=>"1", "num2"=>"1"}が表示される out3 = hash.select do |key, val| key.include?("1") && ( val == 1 ) p out3 # {"num1"=>"1"}
selectメソッド利用時の注意点
selectメソッドは繰り返し処理を使わずに配列やハッシュから該当する要素を抜き出す処理を簡潔に書ける便利なメソッドです。しかし使い方に注意が必要なケースもあります。
次からselectメソッドを利用する際に注意したい使い方を紹介します。
selectの評価方法の注意
これまで何度か取り上げていますが要素を評価する場合、要素が所属するクラスのメソッドを使う必要があるので注意してください。
例えば文字列や数字が混在した配列やハッシュに対してselectメソッドを使う場合、エラーになることがあります。
エラーになるselectの例
arr = ['one', 2, 'three', 'four', 5 ] puts 'case 1' out1 = arr.select { |x| x.include?('o') } p out1
上記の例では配列の要素に数字が含まれており、数字クラスにはinclude?メソッドがないのでエラーが発生します。評価する前にinclude?メソッドが使える文字列に変換していなければなりません。エラー無しで動作させるには、例えば次のようにto_sメソッドを組み合わせる必要があります。
先ほどのエラーを動作させるための修正例
arr = ['one', 2, 'three', 'four', 5 ] puts 'case 1' out1 = arr.select { |x| x.to_s.include?('o') } p out1
配列の添え字で評価する
配列クラスのselectメソッドは、添え字の数字を評価して新しい配列を作ることはできません。しかし配列にeach_with_indexメソッドを適用することで、値と添え字の2つ値をブロックで評価することが可能です。
添え字を評価するselectメソッドの例
arr = ['one', 'two', 'three', 'four', 'five'] out = arr.each_with_index.select { |val, num| num == 3 } p out # [["four"]]を表示する p out[0][0] # "four"を表示する
これは配列の3番目の値と取り出すためにeach_with_indexを使った例です。ただし、each_with_indexを使うと作成された配列の要素は「値と添え字」の配列に変わります。値を使う際に注意してください。
まとめ
これまで紹介したようにRubyのselectメソッドは、配列の要素またはハッシュのキーと値に対してブロックで指定した条件に該当する要素から新しい配列またはハッシュを作成するメソッドです。繰り返し処理を使わずに簡潔に配列やハッシュを操作できるメソッドの1つなので、ぜひ使い方をマスターしてください。
なお、ブロック内で要素を評価する際、文字列や数字などが混在しているとエラーになることがあるので注意が必要です。評価対象の要素を事前に評価で使うメソッドのクラスに合わせるなどの対策が必要なので使う際には注意しましょう。