empty?, blank?, present?の違い

日本語に直すと「空き」「空白」「存在」。

三つそれぞれの使い方を整理します。

empty?

@articles.empty? ? 'true' : 'false'

blank?

@articles.blank? ? 'true' : 'false'

present?

def present?
  !blank?
end

empty?では配列や文字列の中身が存在しているのかしていないのか判定することができる。

少なくともその配列や文字列を格納するものがあることが前提とされている。

なので、レシーバーがnilだと、UndefinedMethodになってしまう。

# 空配列にemptyを使ってみる
[].empty?
# => true

# 空文字にemptyを使ってみる
''.empty?
# => true

# nilにemptyを使ってみる
nil.empty?
# NoMethodError: undefined method `empty?' for nil:NilClass

# nilにemptyメソッドがあるのか確認
nil.respond_to? :empty?
# => false

blank?の場合は、nilに対しても使えてnilならtrueを返す。

pry(main)> ''.blank? # 空文字
=> true
pry(main)> ' '.blank? # 空白文字
=> true
pry(main)> false.blank? 
=> true
pry(main)> nil.blank? 
=> true
pry(main)> [].blank?
=> true 
pry(main)> {}.blank?
=> true

# nilにblankメソッドがあるのか確認
nil.respond_to? :blank?
# => true

Railsに入っているActiveSupportのgemのメソッド

string・配列・ハッシュなど型の器はあっても中身がない場合はtrueになる。

三項演算子を使ってオブジェクトに値が入っているか確認する時に使う。

name.blank? ? 'オブジェクトが空白です' : 'オブジェクトが空白ではないです'

ちなみに、present?は、Active Supportで下記のように定義されているため、!blank?と同じ結果になる。!を手前につけるとnotの意味が付加される。

def present?
  !blank?
end

まとめ

empty?

  • nilや真偽値オブジェクトに対して実行するとfalseを返す。

blank?

  • nilや真偽値オブジェクトに対して実行してもtrueを返す。
  • string・配列・ハッシュなど型の器はあっても中身がない場合はtrueを返す。

present?

  • blank?メソッドの実行結果の真偽値の反対を返すメソッド。

アクティブサポート(activesupport) | Railsドキュメント

blank?メソッドの使い方と返り値