Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

#nil?、#empty?、#blank?、#present?の違い

RubyとRailsには、値の存在やオブジェクトの状態をチェックするために使用できるいくつかのメソッドがあります。 Rubyは#nil?を提供します および#empty? 、およびRailsのActiveSupportは#blank?を追加します および#present? 。これらはすべて独自の方法で機能します。コードで間違ったメソッドを使用すると予期しない結果が生じる可能性があるため、それぞれがデータをどのように評価するかを知ることが重要です。

この記事では、これらの方法に関する知識を更新します。それぞれが使用されるときにどの条件が合格または不合格になるか、および各メソッドが使用できるオブジェクトのタイプを(再)学習します。最後に便利なチートシートも入れます!

#nil?

#nil? ObjectのRubyメソッドです クラス。すべてのクラスがこのクラスを継承しているため、#nil? 任意のオブジェクトで使用できます。 trueを返します nilの場合 (クラスNilClassのインスタンス )そして他のすべてについてはfalse。

nil.nil?
=> true
 
true.nil?
=> false
 
5.nil?
=> false
 
"".nil?
=> false
 
[].nil?
=> false

#empty?

#empty? 文字列、配列、ハッシュ、セットで使用できるメソッドです。 trueを返します オブジェクトのインスタンスの長さがゼロの場合。

文字列で使用すると、trueを返します 空の文字列の場合。

"".empty?
=> true

空白文字は文字であるため、#empty?を使用することに注意してください 空白のみを含む文字列では、falseが返されます 。このため、テキストを検証するときに使用するのに最適な方法ではない可能性があります。たとえば、このメソッドを使用してユーザー入力のみを検証している場合、空白のみを含む入力を処理してしまう可能性があります。

" ".empty?
=> false
 
"\t\n".empty?
=> false

配列、ハッシュ、セットの場合、trueを返します 要素がない場合。

[].empty?
=> true
 
{}.empty?
=> true
 
require 'set'
Set.new.empty?
=> true

#empty?の場合 nilで使用されます または、メソッドを持たないその他のクラス、NoMethodError 例外が発生します。したがって、データのチェックに使用するには、プログラムがクラッシュしないように、さらにチェックを行う必要があります。

if !my_var.nil? && !my_var.empty?
  # make use of my_var
end

使用するより良い方法は、Rails #blank?です。 これから見ていく方法です。

#blank?

#blank? Railsメソッド(ActiveSupport内)です。任意のオブジェクトで動作します。

文字列の場合、trueを返します 空の文字列と空白文字のみを含む文字列の場合。

"".blank?
=> true
 
" ".blank?
=> true
 
"\n\t".blank?
=> true

配列、ハッシュ、セットの場合、#empty?と同じように機能します 、trueを返すという点で 要素がない場合。

[].blank?
=> true
 
{}.blank?
=> true
 
Set.new.blank?
=> true
 
[nil].blank?
=> false
 
["", ""].blank?
=> false
 
person = {:firstName => "John", :lastName => "Doe"}
person.blank?
=> false

falseを返します trueの場合 およびtrue 誤った条件(つまり、nil およびfalse

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

ご覧のとおり、#blank?を使用することをお勧めします #empty?ではなく NoMethodErrorsが発生しないため、データの検証で すべてのオブジェクトで使用できるため、一部のオブジェクトで使用する場合。また、空白のみを含む文字列には合格しません。

#present?

#present? Railsメソッドでもあります。 #blank?とは逆になります。

!my_var.blank? == my_var.present?
=> true

次にいくつかの例を示します。

"".present?
=> false
 
" ".present?
=> false
 
[].present?
=> false
 
nil.present?
=> false
 
true.present?
=> true
 
false.present?
=> false
 
{}.present?
=> false
 
person = {:firstName => "John", :lastName => "Doe"}
person.present?
=> true
 
5.present?
=> true

これは、#empty?よりも検証に適した方法でもあります。 #blank?で取り上げたのと同じ理由で 。

結論

これらのメソッドの名前はわかりにくいため、ブックマークするのに便利なチートシートを次に示します。

#nil? #empty? #blank? #present?
5 false NoMethodError false true
"" false true true false
"" false false true false
"\t\n" false false true false
[] false true true false
["a"] false false false true
{} false true true false
{a: "b"} false false false true
Set.new false true true false
nil true NoMethodError true false
true false NoMethodError false true
false false NoMethodError true false

すべての場合と同様に、#nil?からの選択 、#empty?#blank? および#present? 状況によって異なります。ユーザーがアドレス指定する名前を持っているかどうかを確認するには、#present? たとえば、ぴったりかもしれません。ただし、#blank? および#present すべてのオブジェクトに対してブール値を返します。これにより、値のタイプが間違っている場合にエラーが発生しないため、コードのバグが隠される可能性があります。

Rubyで値をチェックする際の記憶を一新したことを願っています。ご質問やご意見がございましたら、お気軽に@AppSignalまでご連絡ください。


  1. ビットコインとイーサリアムの違い

    2017年は間違いなく暗号通貨の年であり、価格が下がったとしても、特に主要通貨への関心は下がっていません。最も人気のある2つの通貨であるビットコインとイーサリアムは、年間で大幅な価格上昇を見せました。それぞれ、1,000ドル未満から20,000ドル近く、10ドル未満から1,300ドル超になりました。暗号通貨への投資に興味がある場合は、ビットコインとイーサリアムの違いについて簡単に説明します。 1。ビットコインはジェネレーション1、イーサリアムはジェネレーション2 ビットコインは、世間の注目を集めた最初の主要な暗号通貨でした。ある意味、初代です。イーサリアムは数年後に登場し、ビットコインをベ

  2. Spotify と Apple Music の 6 つの違い

    音楽を聴くのが好きなら、多くの音楽ストリーミング プラットフォームが存在することをご存知でしょう。最も人気のあるものは、Spotify と Apple Music です。これらのプラットフォームでは、それぞれが提供する大規模な音楽ライブラリに無制限にアクセスできるサブスクリプションを取得できます。 ただし、これら 2 つのストリーミング サービスには多くの顕著な違いがあります。いずれかのサブスクリプションを検討している場合は、Spotify と Apple Music の違いを知っておくと、リスニングのニーズに最適なプラットフォームを決定するのに役立ちます. 1. 利用可能なコンテンツ