Rubyでnilと空、空白を理解する方法


1129

私は自分自身が繰り返しの違いの明確な定義を探して見つけnil?blank?およびempty?Ruby on Railsの中で。これが私が来た最も近いものです:

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

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

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

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


26
1つは、空の配列がfalseを返すことですpresent?。これはblank?、空の配列に対してtrueを返すためです。
クリス

4
一つの良いところは、それが見ている:nil?上に定義された::Kernelとのオーバーライドされ::NilClassながら、:empty?多くのクラスに分けて実装されている(ネイティブの::String::Array::Hash、および非ネイティブのような他のクラスの::SetSTDLIBからと::ActiveRecord::Relationレールから)。したがって、:nil?は、のすべてのサブクラス、::Objectおよび::Kernelそれ自体が含まれるすべてのクラスで使用でき:empty?ます。これらのクラスは、クラスに具体的に実装または含める必要があります。
2016年

全体のnil概念を理解しようとするなら、ここから始めてください
totymedli 2018年

[1] pry(main)> [].blank? => true
マイケル

回答:


1437

.nil? 任意のオブジェクトで使用でき、オブジェクトがnilの場合はtrueです。

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

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

.empty?nilの何かで実行すると、がスローされます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?

配列取得:配列のすべての要素が空白の場合でもblank?返されます。この場合の空白を判別するには、withを使用します。次に例を示します。falseall?blank?

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

27
質問で述べたように、一部の空でない文字列は空白としてカウントされます。
Andrew Grimm、

1
nilの.emptyを上書きしないのはなぜですか?彼らが.blankを追加できたら?
ティルダ

6
また:false.blank? == true
シャノン

2
言っておきpresenceます!
マルク=アンドレ・Lafortune

2
トムが答えで言及している全空白配列の問題点に加えて、これがセキュリティ問題を引き起こす可能性があることに注意してください。これは、params.nilでない限り、攻撃者が準備されていないコードを使用してチェックするだけの可能性があることに注意してください。またはparams.blank?でない限り、現在Railsで多くの議論と作業が行われています。詳細については、こちらを参照してください:github.com/rails/rails/issues/13420
Houen

675

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

ここに画像の説明を入力してください

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


57
空白に注意してください?そしてプレゼント?Railsのみです。Ruby 2.0.0では例外:NoMethodErrorが返されます。
Lonny Eachus 14

17
any?テーブルを更新する場合は、追加を検討してください。
Dennis

blank?そしてpresent?「ありませんRailsの-のみ」、彼らは自動的にRailsのでは含ましているが、簡単にactivesupportののCore拡張機能を使用することにより、非Railsのコードに含めることができます。stackoverflow.com/questions/4238867/…を
Tin Man

215

ジュリアンのテーブルを拡張するだけです:

ここに画像の説明を入力してください

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


1
@Sibevin Wang、私はこのテーブルをダウンロードして、クレジットを追加する私の回答のいくつかでそれを使用しました。あなたが気にしないことを願っています:)この素晴らしい努力への称賛!
Lahiru 2016

1
Enumerable#any?バニラルビーです。「レールのみ」の下に表示しないでください
daniero

1
@danieroリマインダーをありがとう、テーブルが更新されます。
Sibevin Wang 2016

数値型にも.zero?and があります.nonzero?
DaveMongoose 2017年

63

簡単なヒント: !obj.blank? == obj.present?

いくつかの表現では目に便利/簡単にできます


!obj.nilに相当するものはありますか?
カーク

present?これはactive_supportの一部です。取得するには何を含めるかをここで確認してください:stackoverflow.com/a/4648704/1569
Factor Mystic

2
@カーク:!! objは!obj.nilと同等ですか?
Mohamed Hafez

4
@MohamedHafezいいえ、そうではありません。!!false
Ajedi32 2014年

ああ、@ Ajedi32グッドキャッチ!その1つの例外と同等です。
Mohamed Hafez 2014年

52

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


49

ここに画像の説明を入力してください

  • あるすべてnil?blank?
  • あるすべてempty?blank?
  • ある何もempty?ありませんnil?
  • ある何もnil?ありませんempty?

TL; DR -のみ使用blank?present?あなたは区別する場合を除き""" "


2
すごい!あなたは私の+1を手に入れました
Am33d

16

特別なケースは、ブール値がnilかどうかを評価しようとする場合です:

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

この場合の推奨事項は、 .nil?


14

any?推奨事項についてのちょっとしたメモ:それは一般的にと同等であると彼は正しい!empty?。ただし、空白(ala )のみの文字列にany?戻ります。true" "

もちろん、上記の1.9のコメントも参照してください。


Railsでは、空白文字のみを含む文字列は "空白"です: "\ n \ r \ t" .blank?#=> true
Lonny Eachus 14

13

any?一般にどちらであるかを忘れないでください!empty?。Railsでは、通常、ステートメントの最後に何かがあるかどうかを確認するif somethingunless somethingblank?どこでも動作するように見えるので、必要に応じて使用します。


4
。どれか?Ruby 1.9では文字列を.anyとして使用できませんか?enumerableが必要であり、string#each自体はruby 1.9では機能しません。
Andrew Grimm、

4
any?空でないことを確認する場合は注意してください。偽の値の配列がある場合はfalseを返します。これを回避する方法は、常にtrueのブロックを渡すことです[nil, false].any?{ true }。ただし!empty?、短く、奇妙な動作を覚えていません。
ケルビン2013年

12

nil? すべてのオブジェクトで呼び出して返すことができる標準のRubyメソッドです true、オブジェクトがnil次の場合に。

b = nil
b.nil? # => true

empty? 文字列、配列、ハッシュなどの一部のオブジェクトで呼び出すことができる標準のRubyメソッドであり、 true、これらのオブジェクトに要素が含まれていない場合に。

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

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

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

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


7

他の誰もがその違いをよく説明しています。

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

obj.blank?すべての種類のハンドルnil''[]{}、および戻りtrue値を得ることができない場合、リターンfalse値は、オブジェクトの任意の型で利用可能である場合。


5

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


モデルクラスでのみ動作します!
Roger、

4

Rails 4

@ corban-brookの「Array gotcha:blank?」の代替 配列が空の値しか保持しておらず、空白と見なすことができるかどうかを確認するには?真:

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

次のこともできます:

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

3

nil?任意のオブジェクトで使用できます。これは、オブジェクトに「空白」値を含む値があるかどうかを決定します。

例えば:

example = nil
example.nil?  # true

"".nil?  # false

基本的nil?に、オブジェクトが実際に「nil」に等しい場合にのみtrueを返します。

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

empty?nilオブジェクトはコレクションではないため、nilオブジェクトで呼び出すことはできず、例外が発生することに注意してください。

また、コレクション内のアイテムが空白であっても、コレクションが空であるとは限らないことに注意してください。

blank?基本的にはの組み合わせですnil?empty?それはあなたがコレクションであると仮定していることのオブジェクトをチェックするのに便利ですが、またゼロである可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.