Ruby on Rails における nil v. empty v. blank の簡潔な説明

Ruby on Railsにおけるnil?, blank?, empty?の違いについて、明確な定義を何度も探してしまいます。 これが、私がたどり着いた最も近いものです。

  • blank? オブジェクトは、偽、空、または空白の文字列です。例えば、"", " ", nil, [], {} は空白です。

  • nil? オブジェクトは NilClass のインスタンスです。

  • empty? オブジェクトはクラス固有のもので、その定義はクラスごとに異なります。文字列は文字がなければ空であり、配列はアイテムがなければ空です。

何か足りないものや、より厳密な比較ができるものはありますか?

ソリューション

.nil?`は任意のオブジェクトに使用することができ、オブジェクトがnilの場合はtrueになります。

.empty?は、文字列、配列、ハッシュに使用でき、以下の場合に真を返します。

  • 文字列の長さ==0
  • 配列の長さ == 0
  • ハッシュの長さ == 0

nilであるものに対して.empty?を実行すると、NoMethodErrorが発生します。

そこで登場するのが .blank? です。これはRailsで実装されているもので、文字列、配列、ハッシュに対して.empty?のように動作するだけでなく、任意のオブジェクトに対しても動作します。

nil.blank? == true
false.blank? == true
[].blank? == true
{}.blank? == true
"".blank? == true
5.blank? == false
0.blank? == false

.blank?`は、空ではないがホワイトスペースのみを含む文字列に対してもtrueを評価します。

"  ".blank? == true
"  ".empty? == false

Railsには、.blank?の否定を返す.present?もあります

Array gotcha: blank?は、配列のすべての要素が空白であってもfalseを返します。このような場合に空白を判定するには、例えば all?blank? と一緒に使います。

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 
解説 (12)

ひとつの違いは、.nil?.empty?がプログラミング言語Rubyで提供されているメソッドであるのに対し、.blank?はWeb開発フレームワークRailsで提供されているもの追加であることです。

解説 (0)

一般的には !empty? である any? もお忘れなく。Railsでは通常、文の最後に何かがあるかどうかを if somethingunless something でチェックし、必要に応じて blank? を使用します(どこでも使えるようです)。

解説 (2)