Search

検索したいワードを入力してください

2019年04月10日

Rubyのfindメソッドで要素を取り出す方法を解説

この記事ではfindメソッドの紹介と使い方、また利用の際の注意点について解説しています。Rubyプログラミングでは、配列からある条件を満たす要素を検索して取り出す処理を行う機会は多いのでしっかりと使い方を理解するようにしましょう。

Rubyのfindメソッドとは

Rubyのfindメソッドとは、配列の要素から条件を満たす要素を一つ返すメソッドです。配列要素の探索は、Rubyプログラミングをしている中でもかなり頻繁に行う処理です。このfindメソッドを利用することで、この探索を簡単にすばやく行うことが可能です。

ただし、findメソッドは少し特殊な返り値を返すため、その返り値の扱いに注意が必要になります。注意しておかないとエラーやバグを引き起こす原因となります。この注意点についても以下で解説していきますので、しっかりと理解してエラーを引き起こさないようにしましょう。

Railsのfindメソッドとの違い

Rubyを学んでいる人の多くは、Ruby on RailsというRubyのフレームワークも一緒に学んでいるかと思います。Ruby on Railsの中にもfindという処理が登場しますが、このfindと今回解説するfindは全く別物です。

Ruby on Railsに出てくるfindは、モデルが所有してるメソッドです。モデルの対象テーブルから指定したidを持つデータを取得するためのメソッドとなります。

今回解説するfindは、配列に対するものなのでこの点に注意しながら以下の解説を読んでいってください。

Rubyのfindメソッドの使い方

この章では、Rubyのfindメソッドの使い方について解説します。主な使い方についての解説はもちろん、記事冒頭でお話した注意点についても解説していますのでしっかりと理解するようにしましょう。

findメソッドの基本的な書き方

「配列.find{|変数| 条件式}」と記述します。変数には、配列の各要素の値が渡されます。そして条件式の部分には、検索する値が満たすべき条件式を記述します。

条件式の部分ではtrue or falseを返却するような処理を記述します。処理の返却値がtrueだったときの配列要素が返されます。

findメソッドで指定した条件に一致した要素を取り出す

では、実際にfindメソッドを利用していきます。以下のサンプルコードを見てください。

サンプルコード
sample = [1, 2, 3, 4, 5]
puts sample.find{|item| item == 2} #2


上記のサンプルコードでは、配列の値が2である要素の値を返却しています。このように、find内の条件がtrueとなった要素だけを返却してくれます。

なお条件がtrueとなる要素が複数ある場合は、一番最初にtrueになった要素のみが返されます。条件がtrueになる要素が全部返却されるわけではないので注意しましょう。

sample = [1, 2, 3, 4, 5]
puts sample.find{|item| item %2 == 0} #2


また条件がtrueになる要素が配列内に存在しない場合、このfindメソッドはnilを返却します。

sample = [1, 2, 3, 4, 5]
puts sample.find{|item| item > 10} #(nil)

findメソッドでハッシュの値を検索する方法

次に、findeメソッドでハッシュの値を検索する方法を解説します。findメソッドは、配列だけではなくハッシュの検索にも利用できます。

ハッシュ.find{|キー変数, バリュー変数| 条件式}と記述します。キー変数とバリュー変数には、それぞれ各ハッシュ要素のキーとバリューが順番に渡されます。そして、条件式に合致したキーとバリューを[キーの値, バリューの値]という配列で返却します。

以下にサンプルコードを示します。

サンプルコード
score = {"taro" => 89, "jiro" => 75, "hanako" => 90, "miki" => 94 }
result = score.find{|k, v| k.length <= 4 && v < 80}
puts result #["jiro", 75]
puts result[0] #"jiro"
puts result[1] #75


このサンプルコードでは、「キーの値が4文字以下で、バリューの値が80未満の要素」を条件にしています。この両方の条件を満たす要素は"jiro" => 75なので、この要素が配列になって返されています。

返り値は配列なので、キーの値とバリューの値をそれぞれ取得する場合は、配列で取得するのと同様にインデックス番号を指定して取得します。キーがインデックス番号0、バリューがインデックス番号1です。少し感覚とは異なる返り値となるので、返り値の扱いには注意が必要です。

なお条件式に合致する要素が複数あったとしても、返却される要素は最初に条件に合致した要素になります。この点にも注意しましょう。

score = {"taro" => 89, "jiro" => 75, "hanako" => 90, "miki" => 94 }
result = score.find{|k, v| k.length <= 4 && v < 95}
puts result #["taro", 89]
puts result[0] #"taro"
puts result[1] #89

また条件に合致する要素が存在しない場合は、nilが返されます。空配列が返されるわけではないので注意が必要です。

score = {"taro" => 89, "jiro" => 75, "hanako" => 90, "miki" => 94 }
result = score.find{|k, v| k.length <= 4 && v > 95}
puts result #(nil)

上記の注意点から、ハッシュをfindメソッドを利用して検索し、その返り値をなにかに利用する場合、nilに対する処理を必ず考慮する必要があります。nilを考慮せず実装してしまうと、どこかでバグを生じさせてしまう可能性がありますので注意したほうがよいです。

nilが考慮されたコード

score = {"taro" => 89, "jiro" => 75, "hanako" => 90, "miki" => 94 }
result = score.find{|k, v| k.length <= 4 && v > 95}
puts result
if !result.nil?
puts result[0]
puts result[1]
end


resultがnilでもエラーを生じない

nilが考慮されていないコード

score = {"taro" => 89, "jiro" => 75, "hanako" => 90, "miki" => 94 }
result = score.find{|k, v| k.length <= 4 && v > 95}
puts result
puts result[0]
puts result[1]


上記コードを実行すると、undefined method `[]' for nil:NilClass (NoMethodError)が生じる

findメソッドに似たany?メソッドとは

Rubyのfindメソッドに似た処理を行うメソッドに、any?メソッドが存在します。このメソッドは、配列.any?{|変数| 条件式}と記述し、条件式に合致する要素が配列内に存在するかどうかを判定します。条件式に合致する要素が配列内に存在すればtrueを返し、存在しなければfalseを返却します。

findメソッドとany?メソッドの違いは、返却値が「条件式がtrueになった要素or nil」か「true or false」を返却するかだけです。

以下にサンプルコードを記述します。

サンプルコード
sample = [1, 2, 3, 4, 5]
puts sample.any?{|item| item == 2} #true
puts sample.any?{|item| item > 10} #false


配列内の要素のうち、条件に合致する要素が一つでもあればtrueが返り、一つも無ければfalseが返されているのがわかります。

また、any?メソッドはハッシュに対しても利用できます。記述の仕方は、ハッシュ.any?{|キー変数, バリュー変数| 条件式}となります。返り値がtrue or falseとなること以外は、findメソッド使い方と変わりません。

以下にサンプルコードを示します。

サンプルコード
score = {"taro" => 89, "jiro" => 75, "hanako" => 90, "miki" => 94 }
puts score.any?{|k, v| k.length <= 4 && v > 70} #true
puts score.any?{|k, v| k.length <= 4 && v > 95} #false

findメソッドとany?メソッドは非常に似ていますので、使い分けをしっかりしましょう。以下のように使い分けるとよいです。

・配列に条件を満たす要素が存在するかどうかのみを調べる場合:any?
・配列から条件を満たす要素を抜き出す場合find

前章で解説したとおり、findメソッドは条件に合致する要素が存在しない場合、nilを返してしまいます。これによるバグを防ぐために、あらかじめany?メソッドで条件に合致する要素の存在を調べておくのも良い方法です。

findメソッドのまとめ

今回は、findメソッドについて解説しました。配列要素の検索には必須なメソッドとなりますので、使い方と注意点をしっかりと理解しましょう。また、any?メソッドとその使い方、findメソッドとの使い分け方についても解説しました。

こちらについてもしっかりと違いを理解して、状況に応じた使い分けができるようにしておきましょう。エラーやバグを引き起こさないプログラムをかけるようにしておくことが重要です。

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related