Rubyにはall?any?none?といったメソッドがあります。 配列の中身をチェックして結果を返してくれる。

all?は中身が全て真の場合はtrueを返す

[true, true, true].all?
=> true

# ひとつでもfalseがあれば結果はfalse
[true, false, true].all?
=> false

any?は中身がひとつでも真の場合はtrueを返す

[true, false, true].any?
=> true

# すべてfalseなら結果もfalse
[false, false, false].any?
=> false

none?は全てが偽のときにtrueになる。

[false, false, false].none?
=> true

# ひとつでもtrueがあれば結果はfalse
[false, false, true].none?
=> false

前置きが長くなりました。ここから本題です。

これらのメソッドを使うと、条件の判定なんかで複数の条件をまとめてチェックしないといけない、なんてときにifでやるよりもスリムに書けたりします。

ですが、ひとつだけ注意点があります。

それはすべての要素が判定にかけられるということです。

&&なんかだと、以下のような場合は最初の条件(cat.a?)が偽なら、その次の条件はチェックしないですよね。

if cat.a? && dog.b?
  # trueの処理
end

しかし、all?の場合はcat.a?がtrueでもfalseであってもとdog.b?は必ずチェックされます。

if [cat.a?, dog.b?].all?
  # trueの処理
end

コードを書いていると、cat.a?がfalseのときはdogのインスタンスがそもそも存在しないなんてケースがあります。

その場合はall?メソッドの途中でb? is undefined methodとなりプログラムが落ちます。

そんなときはif&&とか使って普通に書かないといけない、またはundefinedがそもそも発生しないように作るということになると思います。

当然っちゃ当然にも見えるんだけど、all?メソッドとか使っていて気持ちがいいから勢いあまって、時々こんな感じで失敗することが私にはあります。

この記事の環境情報

  • Ruby 3.1.2
  • 早起き成功