Rails Diary

プログラミングの学習記録です。

empty?,blank?,present?,nil?メソッドについて

empty?は入れ物が存在するのが前提

okmt-aya-26.hatenablog.com ↑において

def page_title(page_title="")
  basic_title=アプリ名

  page_title.empty? ? basic_title : page_title + basic_title
end

の様な判定ロジックを用いたが、このロジックの三項演算子におけるempty?の代わりとして何が使えるのか。

present?やblank?、nil?ではどうなるのか

empty?

String,Array,Hash等に定義されているRubyのメソッド。

empty?メソッドを用いる場合は「入れ物が存在する」ことが前提。渡される値がなかった場合、初期値として設定したpage_title=""より空の入れ物が代入されるので、容器の中身は空ですか?(empty?)ということになる。

後述するblank?メソッドと違い、nilや真偽値オブジェクトに対して使うとエラーが出力される。 blank?メソッドの下位互換?

nil.empty?
false.empty?
trure.empty?

NoMethodError: undefined method `empty?' 

NilクラスやTrueクラス、Falseクラスはempty?メソッドを持っていないということ。

nil?

上の例ではpage_title=""という様にを代入していた。空の容器が存在するので何もないことを表すnil?はfalseになる。中身が空とnilは違う。つまり初期値で空を代入している以上nil?を使ったところでfalseしか返ってこない。そもそも値がなかった場合はエラーになってしまうので今回nil?を使うことはできない。

blank?

Rubyのメソッドではなく、Railsに入っているActiveSupportのgemメソッド。レシーバ(メソッドを呼び出したオブジェクト)が空白の場合にtrueを返す。空白でない場合はfalseを返す。

空白とは、nil,false,空文字列,空白文字列,空配列,空ハッシュのこと。
空文字列…''
空白文字列…' '

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

present?

blank?同様にActiveSupportのpresent?メソッド。blank?と反対にレシーバの値が存在すれば存在すればtrueを返し、空白であればfalseを返す。

# ActiveSupport | present?メソッドの定義

def present?
  !blank?
end

そのまんまだった。。

blank?メソッドとempty?メソッドの比較

【Rails】 blank?メソッドの使い方と返り値 | Pikawakaより

レシーバ blank?[空白?] empty?[空?]
''(空文字列) true true
' '(空白文字列) true false
[](空配列) true true
[''](配列要素がある) false false
{}(空ハッシュ) true true
{key: value}(ハッシュ要素あり) false NomethodError
0,0.0,1000 false NomethodError
nil true NomethodError
true false NomethodError
false false NomethodError

参考にしたサイト

2 すべてのオブジェクトで使える拡張機能 | Railsガイド

2.1 black?とpresent? | Railsガイド

nil? empty? blank? present? の使い分け - Qiita

[memo]Railsのpresent?メソッドの使い方 - Qiita

【Rails】 blank?メソッドの使い方と返り値 | Pikawaka