Rubyのany?メソッドを使えば、シンプルな記述で配列の要素のチェックが可能です。なお、Rubyの配列オブジェクトやハッシュオブジェクトには、その要素を検索や編集に使える便利なメソッドが幾つもあります。Rubyで配列を使うなら、わざわざ繰り返し処理を作るのではなく、今回紹介するany?メソッドなどを活用してください。
そしてany?メソッドは、配列の各要素を評価しどれか1つでも真になったら結果を返します。今回はRubyのany?メソッドの使い方について、その使用例を紹介しながら解説します。
- Rubyのany?メソッドは引数の値が配列に含まれているかをチェックするメソッド
- any?メソッドは配列が空かどうかをチェックできる
- any?メソッドはif構文で使える
- any?メソッドはハッシュでも使える
any?メソッドの文法
Rubyには、配列を扱う便利なメソッドが幾つもありますが、その中でも使い方の解り難いメソッドの1つがany?です。次から、any?メソッドについて紹介します。
なお、any?メソッドは、配列に対して使うメソッドの1つで、すべての要素が偽である場合にfalseを返し、1つでも真の要素があればtrueを返します。また、使い方は3通りあり、単独でも使えますが、パターンを指定したり、配列の各要素に対する判定条件を指定することも可能です。
単独で使用する
any?メソッドの最も簡単な使い方は、単独で使う方法です。
配列.any?
この場合、配列内に1つでも真(true)が含まれていればtrueを返します。
any?メソッドを単独で使った例 ar = [ nil, true, false ] puts ar1.any?
この例では、配列arに、trueが1つ含まれているので、ar.any?はtrueを返します。
パターンを指定する
any?では、パターンを指定して要素を検査することも可能です。
配列.any?(パターン)
上記のようにany?に続けて()でパターンを指定し、配列の要素がそのパターンに一致する場合、trueを返します。
パターンを指定した例 colors = [ 'black', 'gray', 'lightgray' ] puts.any?(/light/)
この例では、any?メソッドで、パターンとして/light/を指定することで、配列に「light」が含まれているかをチェックします。そして、この場合、配列colorsに含まれる「lightgray」に「light」が含まれることから、出力結果はtrueです。
各要素に対する判定条件を使う
Rubyには、ループを使わずに配列の要素をチェックする機能が幾つもありましが、any?メソッドもそのように使うことが可能です。この場合、下記のように、「|」で囲った変数に配列の各要素を取り込み、その変数を使い、判定条件を記述できます。
配列.any? {|アイテム| アイテムを使った判定条件}
各要素に対する判定条件を使う例 nums = [ 1, 3, 6 ] nums.any? { |val| val > 5 }
この例では、any?に続く{}内に、配列の各要素をvalに代入し、val > 5という判定条件を指定しています。そして、any?メソッドを適用した配列numsには、これに該当する要素として7があるので、出力結果はtrueです。
Rubyを学びたい方におすすめのスクールはこちら
any?を使う場合の注意点
次から、any?メソッドを使う場合に注意してほしい点について解説します。
単独で指定する場合の注意点
any?を単独で使用した場合のfalseとなる条件は、配列の要素全てがnilまたはfalseの場合だけです。そのため、nilやfalseが格納されるに数字や文字列が混じっている場合、それが原因でtrueが出力されます。
これは、配列作成時に不具合があった場合など、プログラムが誤動作する原因となるので注意してください。
any?を単独で使用してfalseになる例 ar = [ nil, false, false ] puts ar.any?
この例の出力結果は、falseです。
trueとfalse以外を含む配列に適用した例 ar = [ nil, false, 0 ] puts ar.any?
この例の出力結果は、配列にnilでもfalseでもない、0が含まれているためtrueが出力されます。
配列が空ならfalseを返す
any?メソッドは、配列が空の場合、falseを返します。このメソッドだけでは、配列の要素の有無をチェックできないので、必要な場合はlengthメソッドなどで要素の数をチェックしてから、any?を適用してください。
空の配列に適用した例 ar = [] puts ar.any?
この例では、空の配列にany?を適用しているので、falseを出力します。
Rubyを学びたい方におすすめのスクールはこちら
any?を利用した例
trueまたはfalseを返すany?は、Rubyのプログラムでも、特定の文字が配列の中に含まれているかをチェックするif文でよく使われます。次に、そのような例を紹介します。
文字列が配列に含まれるかをチェックする例 def check_one( target, lists ) if( lists.any? {|item| item == target } then return( true ) else return( false ) end end lists = [ 'Perl', 'Sapphire', 'Jet', 'Ruby', 'Emerald' ] target = 'Ruby' if check_one( target, lists ) then puts target + "はあります" else puts target + "はありません" end
この例は、any?を使い、配列listsの中に、targetが含まれるかチェックするRubyのプログラムです。targteのRUbyが、listsに含まれているので、この処理では「Rubyはあります」と出力されます。
Rubyを学びたい方におすすめのスクールはこちら
Hashの配列でany?を使う方法
Rubyでは、キーと値のペアで構成されるHash配列もよく使われますが、下記のように記述すると期待した結果になりません。
Hashに対する間違ったany?の使い方 hashar = [ a:false, b:false, c:false ] puts hashar.any?
この例では、値は全てfalseですが、キーと値のペアが評価されることになり、false以外の値を含む配列にany?を適用するとtrueとなることから、この例ではtrueが出力されます。
そのため、Hashの場合は、{}でブロックを構成し、Hashのキーと値の2つを||無いの変数に代入し、値のみを評価することで、値のみを評価させることが可能です。
Hashに対する正しいany?の使い方 hashar = [ a:false, b:false, c:false ] puts hashar.any? { |k, v| v }
この例では、Hashのキーと値をブロックに記述した「|k, v|」により、キーをkに、値をvに代入します。そのうえで、vのみを評価すると、全てfalseとなるので、falseが出力されます。
Hashの配列にany?を使う例
先ほど、Hashの値として格納されたtrueとfalseを評価する例を紹介しましたが、Hashの値を指定した条件で評価する場合も同じように書けます。次に、Hashの配列を使ったany?の例を紹介します。
文字列がHash配列に含まれるかをチェックする例 def check_one( target, lists ) if( lists.any? {|key, item| item == target } then return( true ) else return( false ) end end lists = { 'w'=>'Perl', 'u'=>'Sapphire', 'b'=>'Jet', 'r'=>'Ruby', 'g'=>'Emerald' } target = 'Ruby' if check_one( target, lists ) then puts target + "はあります" else puts target + "はありません" end
先ほどの文字列をany?でチェックする例と同じ構成を、Hashの配列に適用した例です。この場合、「lists.any? {|key, item| item == target }」で、Hashの値のみ、条件に一致しているかを評価します。そして、この場合、Hashの値の1つが条件の「Ruby」に一致するので、「Rubyはあります」と表示します。
Rubyを学びたい方におすすめのスクールはこちら
まとめ
Rubyには、配列の中の要素を調べたり、操作するための便利なメソッドがたくさんあります。そして、その一つが今回紹介したany?メソッドです。Rubyの配列オブジェクトとHashオブジェクトで使えるメソッドで、どちらでも同じように使えます。
同じ機能はeachメソッドなどの繰り返し処理でも作れますが、any?メソッドを使うことでRubyらしいシンプルなプログラムを作成可能です。ぜひ、Rubyのプログラミングで活用してください。
また、Rubyについてもっと詳しく学びたい方は、ポテパンキャンプの利用を検討されてはいかがでしょうか。
Rubyを学びたい方におすすめのスクールはこちら