web-dev-qa-db-ja.com

Ruby on Railsのnil v。empty v。blankの簡潔な説明

私はRuby on Railsのnil?blank?、およびempty?の違いの明確な定義を繰り返し探しています。これが私が一番近づいたものです:

  • blank?オブジェクトはfalse、空、または空白文字列です。たとえば、""" "nil[]、および{}は空白です。

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

  • empty?オブジェクトはクラス固有のもので、定義はクラスによって異なります。文字列に文字が含まれていない場合は文字列が空になり、項目が含まれていない場合は配列が空になります。

不足しているもの、または比較できる厳密な比較はありますか?

1053
Arrel

.nil?はどのオブジェクトにも使用でき、オブジェクトがnilであれば真です。

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

  • 文字列の長さ== 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も提供.present?は、.blank?の否定を返します。

配列gotcha:blank?は、配列のすべての 要素 が空白の場合でもfalseを返します。この場合、空白かどうかを判断するには、以下のようにall?blank?を使用します。

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 
1366
Corban Brook

私はすべてのケースでこの便利な表を作りました:

enter image description here

blank?present?はRailsによって提供されています。

637
Julian Popov

Julianの表を拡張するだけです。

enter image description here

参照: 空白?空白?nil?傻傻分不清楚

198
Sibevin Wang

クイックヒント:!obj.blank? == obj.present?

いくつかの表現で目に便利/簡単になることができます

58

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

47
Andrew Grimm

enter image description here

  • nil?であるものはすべてblank?です
  • empty?であるものはすべてblank?です
  • empty?であるものはnil?ではありません
  • nil?であるものはempty?ではありません

tl; dr - blank?present?を区別したくない限り、""" "のみを使用してください。

26
steve

特別な場合は、ブール値がnilであるかどうかを評価しようとしているときです。

false.present? == false
false.blank? == true
false.nil? == false

この場合、推奨は.nil?を使用することです。

12
Alan H

any?の勧告についてのちょっとしたメモ:彼はそれが 一般に !empty?と同等であるというのは正しいです。しかし、any?trueをちょうど空白の文字列に返します(ala " ")。

そしてもちろん、上の1.9コメントも見てください。

10
davemyron

一般的にany?である!empty?を忘れないでください。 Railsでは、if somethingまたはunless somethingを使ってステートメントの最後に何かがあるかどうかをチェックしてから、必要に応じてblank?を使用します。

9
Andy

nil?は、すべてのオブジェクトに対して呼び出せる標準のRubyメソッドで、オブジェクトがtrueの場合はnilを返します。

b = nil
b.nil? # => true

empty?は標準のRubyメソッドで、Strings、Arrays、Hashesなどの一部のオブジェクトで呼び出すことができ、これらのオブジェクトに要素が含まれていない場合はtrueが返されます。

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

b = ["2","4"]
b.empty? # => false

nilオブジェクトに対してempty?を呼び出すことはできません。

blank?は、空のオブジェクトだけでなくnilオブジェクトに対しても呼び出すことができるRailsメソッドです。

8
neha

他の誰もが違いが何であるかをよく説明しました。

Ruby on Railsを追加したいのですが、obj.blank?またはobj.present?の代わりにobj.nil?またはobj.empty?を使用することをお勧めします。

obj.blank?はすべての型nil''[]{}を処理し、値が利用できない場合はtrueを返し、任意の型のオブジェクトで値が利用できる場合はfalseを返します。

4

exists?メソッドを使用して、データがデータベースに存在するかどうかを確認できます。 trueまたはfalseのいずれかのブール値を返します。

3
kelvin

レール4

@ corban-brookの に代わるもの - 'Array gotcha:blank?' 配列が空の値のみを保持し、空白と見なすことができるかどうかをチェックするための?本当:

[ nil, '' ].all? &:blank? == true

次のようなこともできます。

[nil, '', "", " ",'  '].reject(&:blank?).blank? == true
2
mahatmanich

nil?はどのオブジェクトにも使用できます。オブジェクトが何らかの値を持っているかどうかを決定します( '空白'値を含む)。

例えば:

example = nil
example.nil?  # true

"".nil?  # false

基本的にnil?はオブジェクトが実際には 'nil'と等しい場合にのみ真を返します。

empty?は、コレクションと見なされるオブジェクトに対してのみ呼び出されます。これには、文字列(文字の集まり)、ハッシュ(キーと値のペアの集まり)、配列(任意のオブジェクトの集まり)などが含まれます。 empty?はコレクションにアイテムがない場合にtrueを返します。

例えば:

"".empty? # true
"hi".empty?   # false
{}.empty?  # true
{"" => ""}.empty?   # false
[].empty?   # true
[nil].empty?  # false

nil.empty?  # NoMethodError: undefined method `empty?' for nil:NilClass

Nilオブジェクトはコレクションではないため、empty?をnilオブジェクトに対して呼び出すことはできず、例外が発生します。

また、コレクション内の項目が空白の場合でも、コレクションが空であることを意味するわけではありません。

blank?は基本的にnil?empty?の組み合わせです。コレクションがコレクションであると想定しているオブジェクトをチェックするのに役立ちますが、nilでも構いません。

1
Chitra