[Ruby]all?,any?,none?メソッドの落とし穴
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
- 早起き成功
Rubyに関する他の記事を読む
- slimでtype='application/ld+json'のscriptタグを書く
- Slack APIによる自動メッセージでユーザーグループにメンションする方法
- RubyでUnixtimeからTimeオブジェクトを生成する
- gemインストール時にUndefined symbols for architecture arm64と出たときの対応
- RubyでUTCの時刻情報をJST基準に変換する
最近の記事を読む
- Flutterでcontextを使わずにlocale情報を取得する
- Cloud RunでIAPを有効にしようとしてハマったこと
- slimでtype='application/ld+json'のscriptタグを書く
- タグマネージャーでjsのloadイベントを発火させたいとき
- mysqlコマンドを実行してERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)と言われたら