#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までご連絡ください。
-
ビットコインとイーサリアムの違い
2017年は間違いなく暗号通貨の年であり、価格が下がったとしても、特に主要通貨への関心は下がっていません。最も人気のある2つの通貨であるビットコインとイーサリアムは、年間で大幅な価格上昇を見せました。それぞれ、1,000ドル未満から20,000ドル近く、10ドル未満から1,300ドル超になりました。暗号通貨への投資に興味がある場合は、ビットコインとイーサリアムの違いについて簡単に説明します。 1。ビットコインはジェネレーション1、イーサリアムはジェネレーション2 ビットコインは、世間の注目を集めた最初の主要な暗号通貨でした。ある意味、初代です。イーサリアムは数年後に登場し、ビットコインをベ
-
Spotify と Apple Music の 6 つの違い
音楽を聴くのが好きなら、多くの音楽ストリーミング プラットフォームが存在することをご存知でしょう。最も人気のあるものは、Spotify と Apple Music です。これらのプラットフォームでは、それぞれが提供する大規模な音楽ライブラリに無制限にアクセスできるサブスクリプションを取得できます。 ただし、これら 2 つのストリーミング サービスには多くの顕著な違いがあります。いずれかのサブスクリプションを検討している場合は、Spotify と Apple Music の違いを知っておくと、リスニングのニーズに最適なプラットフォームを決定するのに役立ちます. 1. 利用可能なコンテンツ