学習記録

アウトプット用に作りました

nil? blank? empty?の検証

nil? blank? empty?の使い分け

似てるけど全然違う、使い分けが曖昧だったのでまとめてみます。0、nil、""(空文字)、" "(空白)、{}(空ハッシュ)、[](空配列)を例にして検証してみます。

nil?

nilの場合のみtrueになります。
それ以外はfalseです。

pry(main)> 0.nil?
=> false
pry(main)> nil.nil?
=> true
pry(main)> "".nil?
=> false
pry(main)> " ".nil?
=> false
pry(main)> {}.nil?
=> false
pry(main)> [].nil?
=> false


empty?

空の文字列、配列、ハッシュの場合trueになります。
空白の時はfalseになります。
nil、0にはエラーが発生します。

pry(main)> 0.empty?
NoMethodError: undefined method `empty?' for 0:Integer
pry(main)> nil.empty?
NoMethodError: undefined method `empty?' for nil:NilClass
pry(main)> "".empty?
=> true
pry(main)> " ".empty?
=> false
pry(main)> {}.empty?
=> true
pry(main)> [].empty?
=> true


blank?

0の時はfalseになります。
その他は全てtrueになります。

 pry(main)> 0.blank?
=> false
pry(main)> nil.blank?
=> true
pry(main)> "".blank?
=> true
pry(main)> " ".blank?
=> true
pry(main)> {}.blank?
=> true
pry(main)> [].blank?
=> true

blank?の反対の使い方ができるpresent?というメソッドも紹介しておきます。

present?

!blank?と同じ意味です。

 pry(main)> 0.present?
=> true
pry(main)> nil.present?
=> false
pry(main)> "".present?
=> false
pry(main)> " ".present?
=> false
pry(main)> {}.present?
=> false
pry(main)> [].present?
=> false


nil? blank? empty?で0はどうなるのか

私は今回の実装でArticle.countで記事数が0ならという条件分岐を作ろう思っていました。しかし上記3つのメソッドを使おうとしてもinteger型の識別まではできませんでした。
最初はArticle.count == 0と実装していたのですが、他にも書き方としてzero?というメソッドもあるようです。
参考 : ruby: nil? empty? blank? どれも0をチェックしない - kinopyo blog