RubyとRailsの真偽判定まとめ

RubyRailsの真偽判定、存在確認に関するまとめ
見つけ次第追加していく予定

【Rails】左辺値が空文字や空配列の場合の短絡評価 - 832.59の派生記事

Rubyの真偽値

偽:falseまたはnil

真:falseまたはnil以外
  (0,'false',''も真)

Rubyのメソッド

  • nil?nilであればtrueを返す。
nil.nil? #=> true
false.nil? #=> false
  • empty?:文字列では空、配列・ハッシュは要素がない場合にtrueを返し、それ以外のクラスではNoMethodErrorが返る。
"".empty? #=> true
" ".empty? #=> false
[].empty? #=> true
{}.empty? #=> true
nil.empty? #=> NoMethodError 
false.empty? #=> NoMethodError 
  • none?:要素全てが偽の場合にtrueを返す。ブロック評価もできる。
[].none? #=> true
[false, nil].none? #=> true
[false, nil, ''].none? #=> false
[false, nil, 0].none? #=> false
[1, 3, 5].none? {|n| n.even?} #=> true
  • any?:要素の中にひとつでも真があればtrueを返す。こちらもブロック評価可。
[].any? #=> false
[false, nil].any? #=> false
[false, nil, ''].any? #=> true
[1, 3, 5].any? {|n| n.even?} #=> false
  • all?:すべての要素が真である場合にtrueを返す。ブロック評価可。
[].all? #=> true
['false', '', 0].all? #=> true
[1, 3, 5].all? {|n| n.odd?}  #=> true
  • one?:要素の中に1つだけ真がある場合にtrueを返す。ブロック評価可能。引数を用意すると===で評価してくれる。
[nil, false].one? #=> false
[nil, false, ''].one? #=> true
[1, 2, 3, 4].one? {|n| n > 3} #=> true
[1, 2, 3, 4].one? {|n| n > 2} #=> false
[nil, 'hoge', 0].one?(Integer) #=> true
[1, 2, 3, 4].include?(2) #=> true
'garammasala'.include?('masa') #=> true

Railsのメソッド

  • blank?nilfalse、上記のempty?な値に対してtrueを返す。「空白」であるか否か。
''.blank? #=> true
' '.blank? #=> true
[].blank? #=> true
{}.blank? #=> true
nil.blank? #=> true
false.blank? #=> true
true.blank? #=> false
  • present?:空白でない場合。!blank?と同等

  • in?:探している要素がオブジェクトに含まれている場合にtrueを返す。include?の引数とオブジェクトが逆になったパターン

numbers = [1, 2, 3, 4]
2.in?(numbers) #=> true
# Userモデルにガラムマサラ1人が存在すると仮定
User.exists? #=> true
User.exists?(name: 'ガラムマサラ') #=> true
User.exists?(2) #=> false 

present?を使うとレコードを全てDBから取得し配列としてから評価。
exists?ではSQLが exists式を使い、条件に該当するレコードが1件でも存在すればDBがそこで探索を打ち切ってくれるので、ActiveRecordではexists?を使うのがよさそう

ActiveRecord::Type::Boolean.new.cast()という形で、引数をtruefalseにしてくれる。文字列の'false'などもブール値として処理できる
nilnil,''
偽:false,0,"0",:"0","f",:f,"F",:F,"false",:false,
  "FALSE",:FALSE,"off",:off,"OFF",:OFF
真:上記以外のもの

ActiveRecord::Type::Boolean.new.cast(nil) #=> nil
ActiveRecord::Type::Boolean.new.cast('') #=> nil
ActiveRecord::Type::Boolean.new.cast(false) #=> false
ActiveRecord::Type::Boolean.new.cast('f') #=> false
ActiveRecord::Type::Boolean.new.cast(0) #=> false
ActiveRecord::Type::Boolean.new.cast('OFF') #=> false
ActiveRecord::Type::Boolean.new.cast('False') #=> true
ActiveRecord::Type::Boolean.new.cast('Off') #=> true

参考:ActiveRecord::Type::Boolean#cast の返り値が nil となるケースについて - Qiita
実際のRailsのコードも抽出してくれている


ちなみにJavaScriptのfalsyな値
false, undefined, null, 0, 0n, NaN, ""

JS版もいつかまとめれたら
追加推奨のメソッドあればコメントください。


  • 22/11/30 @haruguchiさんにone,include?,in?を教えていただいたので追加しました