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?」メソッドと、RailsのActiveSupportによって提供されている「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ではなく、レシーバーを返します。
状況によっては、こちらの方が可読性が良くなる場合があります。
参考情報
https://ref.xaio.jp/ruby/classes/object/nil