Rubyの「nil?・empty?」とRailsの「blank?・present?」について

【結論】

nil?メソッドは、レシーバーがnilのときtrueを返し、nilではない場合falseを返す

empty?メソッドは、オブジェクトが空(空文字列("")・空配列([])・空ハッシュ({})のときtrueを返し、1つ以上の要素があればfalseを返す。文字列・配列・ハッシュ以外に使うとエラーになる。

blank?メソッドは、オブジェクトがnil, '', ' ', [], {}, falseのときtrueを返し、1つ以上の要素があればfalseを返す

present?メソッドは、オブジェクトがnil, '', ' ', [], {}, false」以外のときにtrueを返し、それ以外はfalseを返す(blank?の逆)

【目次】

【本題】

オブジェクトの有無を判定するメソッド

Railsでオブジェクトの有無を判定する場合、細かい使い分けが出来るようにいくつかメソッドが用意されています。

それは、Rubyに組み込まれている「nil?・empty?」メソッドと、RailsActiveSupportによって提供されている「blank?・present?」です。

今回は、それらの仕様をまとめます。

nil?メソッド

レシーバーがnilのときtrueを返し、nilではない場合falseを返すメソッドです。

a = nil
a.nil?
# => true

a = 0
a.nil?
# => false

a = ''
a.nil?
# => false

a = []
a.nil?
# => false

RubyのObjectClassのメソッドなので、全てのオブジェクトで使用可能です。

empty?メソッド

オブジェクトが空(空文字列("")・空配列([])・空ハッシュ({})のときtrueを返し、1つ以上の要素があればfalseを返す。

なお、空白スペース(ホワイトスペース)だけの文字は、要素が入っていると見なされて、falseを返します。

a = ''
a.empty?
# => true

a = [ ]
a.empty?
# => true

a = {}
a.empty?
# => true

a = ' '
a.empty?
# => false

a = 'aaa'
a.empty?
# => false

a = [1, 2, 3]
a.empty?
# => false

a = { key: 'value' }
a.empty?
# => false

なお、nilに対してempty?メソッドを利用すると、エラーが発生します。

a = nil
a.empty?
# => NoMethodError (undefined method `empty?' for nil:NilClass)

これは、empty?メソッドがString・Array・HashClassで定義されているメソッドで、NilClassでは定義されていないためです。

なので、使用できるのは文字列と配列とハッシュのみです。

blank?メソッド

オブジェクトがnil, '', ' ', [], {}, falseのときtrueを返し、1つ以上の要素があればfalseを返すメソッドです。

ObjectClassの拡張なので、nilやfalseも含めた全てのオブジェクトに対して使用することが可能です。

なお、empty?と異なり空白スペース(ホワイトスペース)だけの文字も、trueを返します。

a = nil
a.blank?
# => true

a = false
a.blank?
# => true

a = ''
a.blank?
# => true

a = ' '
a.blank?
# => true

a = []
a.blank?
# => true

a = {}
a.blank?
# => true

a = 'aaa'
a.blank?
# => false

a = [1, 2, 3]
a.blank?
# => false

a = { key: 'value' }
a.blank?
# => false

present?メソッド

オブジェクトがnil, '', ' ', [], {}, false」以外のときtrueを返し、それ以外でfalseを返すメソッドです。

blank?メソッドと全く逆の働きをするメソッドです。

これもObjectClassの拡張なので、nilやfalseも含めた全てのオブジェクトに対して使用することが可能です。

a = nil
a.present?
# => false

a = false
a.present?
# => false

a = ''
a.present?
# => false

a = ' '
a.present?
# => false

a = []
a.present?
# => false

a = {}
a.present?
# => false

a = 'aaa'
a.present?
# => true

a = [1, 2, 3]
a.present?
# => true

a = { key: 'value' }
a.present?
# => true

なおpresenceメソッドという似た働きを持つメソッドが存在します。

これは条件に一致した場合、trueではなく、レシーバーを返します。

状況によっては、こちらの方が可読性が良くなる場合があります。

ryoutaku-jo.hatenablog.com

参考情報

https://ref.xaio.jp/ruby/classes/object/nil

https://ref.xaio.jp/wikis/2/entries/search?q=empty

Object