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

【Ruby入門】any?・all?・none?・one?メソッドで条件判定をスマートに書く方法

今回は、配列やハッシュなど、Enumerableモジュールをincludeしているオブジェクトに対して条件判定を行う際に役立つ、4つの便利なメソッド「all?」「none?」「any?」「one?」について解説します。

これらのメソッドは、いずれもtrueまたはfalseを返します。

それでは始めましょう!

Rubyのall?メソッド

例えば、「配列内のすべての文字列が特定のサイズであるか」を確認したい場面を考えてみましょう。

素朴に書くと、このようになります:

def all_words_have_specific_size?(words)
  return false if words.empty?

  words.each do |str|
    return false unless str.size == 5
  end

  true
end

words = ["bacon", "orange", "apple"]

all_words_have_specific_size?(words)
# false

このコードでは、すべての文字列を1つずつチェックし、サイズが期待値と異なればfalseを返し、最後まで問題がなければtrueを返しています。

しかし、これだけの目的にしてはコード量が多すぎますよね。

しかも、この種のチェックをするたびに毎回同じような処理を書く必要があるとしたら…かなり面倒です。

ここで本当に重要なのは、次の1行だけです。

str.size == 5

これこそがチェックしたい条件そのものです。

もっと良い書き方はあるのでしょうか?

はい、あります!

all?メソッドを使えば、面倒な処理はすべて任せられます。

書き方はこちら:

strings.all? { |str| str.size == 5 }

たったこれだけでOKです。

all?メソッドと空の配列

知っておくべき重要なポイントがあります。

all?メソッドは、空の配列に対して呼び出すとtrueを返すということです。

:

[].all? { |s| s.size == 1 }
# true

解説:

falseになる要素が1つも存在しないのだから、「すべての要素がtrueである」とみなせる——これがこの挙動の背後にある論理です。

Rubyのnone?メソッド

all?の逆の判定をしたい場合は、none?を使いましょう。

:

strings.none? { |str| str.size == 5 }

これは、どの文字列も条件に一致しなければtrueを返し、1つでも一致するものがあればfalseを返します。

if文におけるunlessのようなイメージです。

Rubyのany?メソッド

「要素の中に1つでも条件に一致するものがあるか」を知りたい場合はどうでしょう?

そんなときはany?メソッドが使えます!

:

[1,2,3,4,5].any?
# true

この例では、any?empty?の逆のように動作します。しかし、すべての場面でそうなるわけではありません。

なぜなら、any?は次の質問をしているからです:

「この配列の中に、TRUTHY(真と評価される)な要素は存在するか?」

配列がnilfalseといった非truthyな値だけを含んでいる場合、結果はfalseになります。しかし、配列自体は空ではありません。

:

[nil].any?
# false

ブロックを渡すこともできます。

[1,2,3].any? { |n| n > 0 }
# true

これは、「少なくとも1つの要素に対してn > 0trueになるか」をチェックしています。

Rubyのone?メソッド

one?メソッドを使うと、「ちょうど1つだけの要素がtrueを返すか」を確認できます。

:

["a", 1, {}].one? { |obj| obj.kind_of?(Hash) }
# true

ブロックなしで使えば、「配列にtruthyな値(false/nil以外)がちょうど1つ含まれているか」をチェックできます。

["a"].one?
# true

[].one?
# false

[nil].one?
# false

筆者としては、より明示的で誰にとっても分かりやすいsize == 1を使うことをおすすめします。one?はあまり一般的ではないメソッドなので、知らない人にも伝わる書き方の方が良いでしょう。

Ruby 2.5からの新機能

Ruby 2.5以降では、これら4つのメソッド(any? / all? / none? / one?)は、grepと同様に引数を受け取れるようになりました。

具体例を見てみましょう:

[:orange, :apple, :coconut].any?(Symbol)
# true

[1,2,3].all?(1..10)
# true

クラス、正規表現、範囲(Range)によるチェックをしたい場合に、とても便利なショートカットです。

まとめ

今回は、日々のコーディング作業を大幅に節約してくれる、Rubyの4つの素晴らしいメソッドを学びました。これらのメソッドは、必ずtrueまたはfalseのどちらかを返します。

  • all?: すべての要素が条件を満たすときtrue
  • none?: 条件を満たす要素が1つもないときtrue
  • any?: 条件を満たす要素が1つ以上あるときtrue
  • one?: 条件を満たす要素がちょうど1つだけのときtrue

まだ使ったことがない方は、ぜひ今すぐ試してみてください。

この記事が役に立ったと思ったら、ぜひシェアしてください。

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

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

  2. RubyのStructとOpenStructの使い方を徹底解説!値オブジェクトを簡単に作る方法

    Rubyには、関連する属性をまとめて保持する「値オブジェクト」を手軽に作れるStructという組み込みクラスが用意されています。本記事では、Structの基本的な使い方から注意点、そしてOpenStructとの違いまで詳しく解説します。 そもそもStructとは何か? StructはRubyに組み込まれたクラスで、新しいクラスを動的に生成し、値オブジェクト(Value Object)を作成するために使われます。値オブジェクトとは、関連性のある複数の属性をひとまとめにして扱うためのオブジェクトです。 具体例を挙げてみましょう。 2つの座標(xとy)を持つPointというデータを表したい場合、この