Rubyで文字列のNilまたはLength == 0をチェックするより良い方法はありますか?


169

Rubyで文字列がnilであるか、長さが0であるかどうかを確認するには、次の方法より良い方法はありますか?

if !my_string || my_string.length == 0
  return true
else
  return false
end

C#では便利です

string.IsNullOrEmpty(myString)

Rubyに似たものはありますか?


16
「if(条件)then true else false」のようなifステートメントを持つことは冗長です。条件自体はifステートメントと同じ真実性を持っています。
KaptajnKold 2009年

my_string || my_string.length == 0引き上げるNoMethodError場合はmy_stringnilです。私はあなたが意味したと思います:my_string.nil? || my_string.length == 0
16

1
!my_string || my_string.length == 0
該当

回答:


224

パフォーマンスが気にならないときは、これをよく使います。

if my_string.to_s == ''
  # It's nil or empty
end

もちろん様々なバリエーションがあります...

if my_string.to_s.strip.length == 0
  # It's nil, empty, or just whitespace
end

2
使用stripするバリエーションは非常に非効率的です。
マルク=アンドレ・Lafortune

10
別の興味深い方法は、my_string.to_s.empty?
Ricardo Pessoa 2013年

ほとんどの人にとって、最初のオプションは完全に受け入れ可能であり、よく読みます。
amrcus 2014年

68

ActiveSupportを必要とする場合は#blank?、NilClassとStringの両方に定義されているメソッドを使用できます。


15
空白のみを含む文字列は依然として空白と見なされることに注意してください。つまり、「.blank?本当です。
Grant Hutchins、

2
また、ブールfalse、{}、および[]は空白と見なされます。つまり、{}。blank?、[]。blank?、false.blank?すべて真と評価されます。
ShaharZ 2016

64

私はこれを次のように行います(非Rails / ActiveSupport環境で):

variable.to_s.empty?

これは次の理由で機能します:

nil.to_s == ""
"".to_s == ""

3
string.to_s.empty?との両方nilで機能する理由を説明し""ます。
ジョージア

31

jcobyの提案の代替案は次のとおりです。

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end

10
しかし..しかし.. ruby​​コアライブラリはすでにこれを実装しています。nil.to_s => ""、つまり、thing.to_s == ""と言うことができる
DigitalRoss

1
@DigitalRossこれにより、わずかなパフォーマンスの問題である場合とそうでない場合がある文字列変換が回避されます。
Vortico 2014

30

Rails(ActiveSupport)の前にここで言ったように、便利な空白がありますか?メソッドとそれはこのように実装されています:

class Object
  def blank?
    respond_to?(:empty?) ? empty? : !self
  end
end

Rubyベースのプロジェクトに簡単に追加できます。

このソリューションの優れた点は、文字列だけでなく、配列やその他の型に対しても自動で機能することです。


15

variable.blank?それを行います。文字列が空の場合、または文字列がnilの場合、trueを返します。


12
実際、これはレールのみの拡張であり、純粋なルビではありません。ただし、レールを使用している場合は非常に便利です。
James P McGrath

13

nil?ブール値のコンテキストでは省略できます。通常、これを使用してC#コードを複製できます。

return my_string.nil? || my_string.empty?

7

まず、その方法に注意してください。

ジェシーEzelは言います:

ブラッド・エイブラムス

「この方法は便利に思えるかもしれませんが、ほとんどの場合、この状況はより深いバグを隠そうとすることから発生することがわかりました。

コードは文字列の使用に関して特定のプロトコルに固執する必要があり、ライブラリコードおよび使用するコードにおけるプロトコルの使用を理解する必要があります。

NullOrEmptyプロトコルは通常、迅速な修正です(したがって、実際の問題はまだどこかにあり、2つのプロトコルが使用されています)、または新しいコードを実装する際の特定のプロトコルに関する専門知識の欠如です(また、戻り値は)。」

また、Stringクラスにパッチを適用する場合は、NilClassにもパッチが適用されていないことを確認してください

class NilClass
    def empty?; true; end
end

5

すべてのクラスにはnil?メソッドがあります:

if a_variable.nil?
    # the variable has a nil value
end

そして文字列にはempty?メソッドがあります:

if a_string.empty?
    # the string is empty
}

文字列は空の場合等しくないnilので、empty?メソッドを使用して文字列が空かどうかを確認してください。


4

別のオプションは、その場でnilを空の結果に変換することです:

(my_string||'').empty?


2

Konrad Rudolphが正しい答えを持っています。

それが本当にあなたを悩ませているなら、サルはStringクラスにパッチを当てるか、あなたが選んだクラス/モジュールに追加します。ただし、本当に説得力のある理由がない限り、コアオブジェクトにパッチを適用することはお勧めできません。

class String
  def self.nilorempty?(string)
    string.nil? || string.empty?
  end
end

その後、あなたは行うことができます String.nilorempty? mystring


2

NameError例外を回避しながらプレーンRubyで空の文字列を確認する

ここにはいくつかの良い答えがありますが、ここでの一般的な使用例に対処するためにActiveSupportやモンキーパッチは必要ありません。例えば:

my_string.to_s.empty? if defined? my_string

my_stringがnilまたは空の文字列の場合、これは「正しいこと」を行いますがmy_stringが定義されていない場合、NameError例外は発生しません。これは一般に、より不自然な方法よりも好ましい方法です。

my_string.to_s.empty? rescue NameError

または、より冗長なilkです。例外が発生することを予期していないもののために本当に保存されるべきだからです。この場合、それは一般的なエラーである可能性がありますが、未定義の変数は実際には例外的な状況ではないため、それに応じて処理する必要があります。

あなたのマイレージは異なる場合があります。


1

絞り込みを試しましたか?

module Nothingness
  refine String do
    alias_method :nothing?, :empty?
  end

  refine NilClass do
    alias_method :nothing?, :nil?
  end
end

using Nothingness

return my_string.nothing?

1

レールを使用している場合は、 #present?

require 'rails'

nil.present?  # ==> false (Works on nil)
''.present?    # ==> false (Works on strings)
'  '.present?  # ==> false (Works on blank strings)
[].present?    # ==> false(Works on arrays)
false.present? # ==> false (Works on boolean)

したがって、逆に長さがゼロまたはゼロかどうかをチェックするには !present?

!(nil.present?)  # ==> true
!(''.present?)    # ==> true
!('  '.present?)  # ==> true
!([].present?)    # ==> true
!(false.present?) # ==> true

0

レールで試すことができます#blank?

警告:文字列がスペースで構成されている場合、肯定的な結果が得られます。

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

それを指摘したかっただけです。多分それはあなたのニーズに合っています

UPD。なぜフィードに古い質問が表示されるのですか?ネクロポストしてすみません。


0

コードゴルファー向け:

if my_string=~/./
  p 'non-empty string'
else
  p 'nil or empty string'
end

または、ゴルファーでない場合(ruby 2.3以降が必要):

if my_string&.size&.positive?
  # nonzero? also works
  p 'non-empty string'
else
  p 'nil or empty string'
end
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.