はじめに
Rubyで繰り返し処理を使って条件を満たしているかどうかを確認したいことって多くないでしょうか。
今回はそのメソッドのうちの一つall?
とその類似メソッドについてまとめています。
この記事が役に立つ方
- 繰り返し処理はつい
each
ばかりを使ってしまう - 条件を満たしているかどうかは
if
ばかり使ってしまう - Ruby初心者
この記事のメリット
-
all?
が使えるようになる - 繰り返し処理の引き出しが増える
環境
- Ruby 2.6.3
all?
メソッドとは?
公式リファレンスによると、
すべての要素が真である場合に true を返します。 偽である要素があれば、ただちに false を返します。
ブロックを伴う場合は、各要素に対してブロックを評価し、すべての結果 が真である場合に true を返します。ブロックが偽を返した時点で、 ただちに false を返します。
基本構文
all? {|item| ... } -> bool # ブロックを使う場合
all?(pattern) -> bool # パターンを指定する場合
では、以下の例で実際の動きを見てみましょう。
挙動と類似メソッド
前提
以下のような配列array1
とarray2
、empty_array
を定義します。
array1 = [1, 2, 3, 4, 5]
array2 = [-1, 0, 1, 2, 3]
empty_array = [] # 空の配列
この3つの配列について、それぞれメソッドと条件を変えながら挙動をみていきましょう。
all?
全てが真か?
条件:全てが正の数か?
empty_array
はtrue
が返されることに注意です。
array1.all?{ |n| n > 0 }
=> true
array2.all?{ |n| n > 0 }
=> false
empty_array.all?{ |n| n > 0 }
=> true
none?
全てが偽か?
条件:すべてが3以上「でない」か?(3以下か)
all?
のときと同様、empty_array
はtrue
が返されます。
array1.none?{ |n| n > 3 }
=> false
array2.none?{ |n| n > 3 }
=> true
empty_array.none?{ |n| n > 3 }
=> true
any?
1つでも真か?
条件:1つでも0以下か?
empty_array
はfalse
が返されます。
array1.any?{ |n| n < 0}
=> false
array2.any?{ |n| n < 0}
=> true
empty_array.any?{ |n| n < 0 }
=> false
one?
1つだけ真か?
条件:1つだけ0以下か?
empty_array
はfalse
が返されます。
array1.one?{ |n| n < 0}
=> false
array2.one?{ |n| n < 0}
=> true
empty_array.one?{ |n| n < 0 }
=> false
おわりに
empty_array
のtrue
、false
の理由がなぜなのか、イマイチ理解しきれませんでした。
もし中のロジックが分かる方がいらっしゃいましたら教えて頂きたいです。
とりあえず、そういうものと捉えています。
【2019/11/13 追記】
@scivolaさんにコメント頂き、無事解決しました!
いつもありがとうございます。
参考にさせて頂いたサイト(いつもありがとうございます)
module Enumerable (Ruby 2.6.0)
instance method Enumerable#all? (Ruby 2.6.0)