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?メソッドの実行結果の真偽値の反対を返すメソッド。