RubyやRailsのnil? empty? blank? present?の使い方

RubyやRailsで使われている4つの真偽メソッド(nil?,empty?,blank?,present?)の使い方や、どのように実装されているかを調べたので解説していく。

nil?の使い方

レシーバがnilである場合はtrueを返し、nilでない場合はfalseを返すメソッド。(レシーバとは、’test’.nil?の’test’の部分のようにメソッドを呼び出している本体のこと)

nil?はRubyで定義されているメソッドなので、RubyとRailsで使える。

「じゃあ、nilと判断されるオブジェクトにはどんなものがあるの?」と言う話になるが、以下の例を見たほうが早い。

'test'.nil? => false
''.nil?     => false

a = [] 
a.nil?      => false
a[1]        => true

true.nil?   => false
false.nil?  => false

例を見てわかるように、未定義のオブジェクトの場合はtrueが返ってきて、a = [] とか 'test'の様に定義済みのオブジェクトであれば、中身が空でもfalseが返ってくる。

参考記事:instance method Object#nil? (Ruby 2.5.0)

empty?の使い方

empty?はレシーバが空のオブジェクトの場合はtrueが返ってくる。また、empty?メソッドはStringクラス、Hashクラス、Arrayクラスにそれぞれ個別に定義されている。

empty?はRubyで定義されているメソッドなので、RubyとRailsで使える。

[].empty?   => true

a = ['test','test2']
a.empty?       => false
a[0].empty?    => false

'test'.empty?  => false
''.empty?      => true

{}.empty?      => false

参考記事:instance method String#empty? (Ruby 2.5.0)

参考記事:instance method Array#empty? (Ruby 2.5.0)

参考記事:instance method Hash#empty? (Ruby 2.5.0)

blank?の使い方

先ほどのnil?とempty?の2つのメソッドの機能を同時に備えたメソッド。レシーバがnilまたは空の時にtrueを返す。

また、Railsのソースコード(厳密にはactivesupportと言うgem)の中で以下の様に定義されている。

  def blank?
    respond_to?(:empty?) ? !!empty? : !self
  end

上のコードを1つずつみていこう。

まずrespond_to?メソッドを使っているが、これは引数の中で定義されているメソッドが使えるかを判定するメソッドだ。

上記の例ではrespond_to?(:empty?)となっているので、empty?メソッドが使えるのであればtrueを返す。例えば、'test'.empty?とか''.empty?等の場合はempty?メソッドが使えるのでtrueになるが、true.empty?の場合はempty?メソッドが使えないのでfalseになる。

次に三項演算子を使っているので、respond_to?がtrueであれば!!empty? を使う。empty?の前に!!が書かれているが、!!と書くことで確実にtrueかfalseを返すようにできる。

また、blank?はRailsで使えるが、Rubyの場合はactivesupportのgemを入れなければ使えないので注意

参考記事:rails/blank.rb at fc5dd0b85189811062c85520fd70de8389b55aeb · rails/rails

present?の使い方

present?はblank?の真逆のメソッド。nil?やempty?でなければtrueを返す。

activesupportのコード内でも超シンプルに定義されている。

  def present?
    !blank?
  end

参考記事:rails/blank.rb at fc5dd0b85189811062c85520fd70de8389b55aeb · rails/rails

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

SNS Shere

Related Post

記事はありませんでした